中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

IOS中UIWebView、WKWebView之JS交互

發布時間:2020-10-09 03:42:41 來源:腳本之家 閱讀:242 作者:小小棒棒糖 欄目:移動開發

做客戶端開發,肯定避免不了JS交互,于是自己對蘋果接口做了個簡易封裝:

JSExport-->UIWebView+Interaction、WKScriptMessageHandler -->WKWebView+Interaction以備以后使用。

代碼非常簡潔,見這里:https://github.com/V5zhou/JSInteraction.git

舊方式

舊的交互方式有通過UIWebViewDelegate實現的:JS與客戶端定義好跳轉頁面參數,在將要跳轉時捕獲關鍵字,然后處理業務。

iOS端:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  NSString *urlString = [[request URL] absoluteString];
  if ([urlString isEqualToString:@"objc://loading"]) {
    if (_gotoRootViewController) {
      _gotoRootViewController();
    }
  }
  return YES;
}

JS端:

<!DOCTYPE html>
<html>
  <title>test</title>
  <meta charset="utf-8">
    <body>
      <a href="javascript:document.location = 'objc://loading'" rel="external nofollow" class="btn">這是交互按鈕</a>
    </body>
</html>

UIWebView+JSExport方式

導入JavaScriptCore.framework,并導入我的擴展類#import "UIWebView+Interaction.h"。

使用方式

OC調JS:

[_webView InterActionToJs:@"alertMobile('15625298071')"];

JS調OC:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
  [self.webView InterActionToOc:^(InterActionOcType functionType, NSDictionary *param) {
    switch (functionType) {
      case InterActionOcType_alert:
      {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:param[@"title"] message:param[@"content"] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"確定", nil];
        [alert show];
      }
        break;
      case InterActionOcType_present:
      {
        self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        Class Cls = NSClassFromString(param[@"toController"]);
        BOOL isAnimate = [param[@"animate"] boolValue];
        UIViewController *ctl = [[Cls alloc] init];
        [self presentViewController:ctl animated:isAnimate completion:nil];
      }
        break;

      default:
        break;
    }
  }];
}

添加動作

//自定義添加功能類型
typedef NS_ENUM(NSUInteger, InterActionOcType) {
  InterActionOcType_alert = 0,
  InterActionOcType_present,
  InterActionOcType_xxxxxxx,   //有啥需求就和這里添加
};

并且對應的html中添加JS,參數封裝為字典形式。例:

function myPresent(ctl) {
      var param = new Array();
      param["animate"] = 1;
      param["toController"] = "SecondViewController";
      WebViewInteraction.callBack(1, param);
    }

其中callBack是通過這個JSExport實現的

@protocol WebViewJSExport <JSExport>
JSExportAs
(callBack /** callBack 作為js方法的別名 */,
 - (void)awakeOC:(InterActionOcType)type param:(NSDictionary *)param
 );
@end

WKWebView+WKScriptMessageHandler方式

導入WebKit.framework,并導入我的擴展類#import "WKWebView+Interaction.h"。

使用方式

OC調JS:

[self.wkWebView InterActionToJs:@"JSReloadTitle('你點了刷新JS按鈕,我沒猜錯!')"];

JS調OC:

//注冊交互類型
  [self.wkWebView registerScriptTypes:@{@"OCDismiss" : @(WKInterActionOcType_dismiss),
                     @"OCShowAlert" : @(WKInterActionOcType_alert)}];

  [self.wkWebView InterActionToOc:^(WKInterActionOcType functionType, NSDictionary *param) {
    switch (functionType) {
      case WKInterActionOcType_dismiss:
      {
        BOOL isAnimate = [param[@"animate"] boolValue];
        [self dismissViewControllerAnimated:isAnimate completion:nil];
      }
        break;
      case WKInterActionOcType_alert:
      {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"JS去做平方" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
        alert.alertViewStyle = UIAlertViewStylePlainTextInput;
        [alert show];
      }
        break;
      default:
        break;
    }
  }];

添加動作

//自定義添加功能類型
typedef NS_ENUM(NSUInteger, WKInterActionOcType) {
  WKInterActionOcType_alert = 0,
  WKInterActionOcType_dismiss,
  WKInterActionOcType_xxxxxxx,   //有啥需求就和這里添加
};

并且對應的html中添加JS,參數封裝為字典形式。例:

//js調oc
function myDismiss() {
  window.webkit.messageHandlers.OCDismiss.postMessage({"animate" : 1});  //這里的OCDismiss對應注冊類型
}

其中callBack是通過WKScriptMessageHandler實現的

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
  dispatch_async(dispatch_get_main_queue(), ^{
    NSString *name = message.name;
    NSDictionary *value = message.body;
    WKInterActionOcType type = [self.typeDict[name] integerValue];
    if (self.block) {
      self.block(type, value);
    }
  });
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大关县| 嘉定区| 普兰县| 柞水县| 利津县| 施秉县| 信丰县| 深州市| 理塘县| 开化县| 罗定市| 潞城市| 闽侯县| 万盛区| 清原| 武乡县| 镇平县| 普洱| 西平县| 高要市| 马尔康县| 纳雍县| 年辖:市辖区| 万全县| 迁安市| 乌什县| 康平县| 正定县| 马山县| 西丰县| 黔西县| 云和县| 垫江县| 镇赉县| 城市| 仁怀市| 肃南| 格尔木市| 会昌县| 米泉市| 巍山|