iOS开发中OC与JS的交互

WKWebView

JS调用OC方法(常使用)

使用WKScriptMessageHandler协议
创建WKWebView的代码:

  WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    // 设置偏好设置
    config.preferences = [[WKPreferences alloc] init];
    // 默认为0
    config.preferences.minimumFontSize = 10;
    // 默认认为YES
    config.preferences.javaScriptEnabled = YES;
    // 在iOS上默认为NO,表示不能自动通过窗口打开
    config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
    config.processPool = [[WKProcessPool alloc] init];
    // 通过JS与webview内容交互
    config.userContentController = [[WKUserContentController alloc] init];
    // 注入JS对象名称AppModel,当JS通过AppModel来调用时,
    // 我们可以在WKScriptMessageHandler代理中接收到
    [config.userContentController addScriptMessageHandler:self name:@"JSMethod"];    //
    _webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
    _webView.UIDelegate = self;
    _webView.navigationDelegate = self;
    [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];

其中

  [config.userContentController addScriptMessageHandler:self name:@"JSMethod"]; 

设置代理,注入JS方法,方法名是“JSMethod”,这个方法名要和网页中的JS方法名保持统一。
H5代码:

  window.webkit.messageHandlers.JSMethod.postMessage() 

实现代理方法:

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    NSLog(@"body:%@",message.body);
    NSLog(@"name:%@",message.name);
    if ([message.name isEqualToString:@"showMessage"]) {
        NSLog(@"调用成功...");
    }
}

在代理方法中通过message的name属性获取js方法名确定是哪个js方法从而调用哪个OC方法。
(个人习惯在WKWebView的基类控制器中注入一个方法名,然后通过message的body属性确认调用的方法以及传递过来的参数,这样就不用在iOS端每个页面每个js方法都要注入一个新的JS方法)。

OC调用JS

代码:

 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{

NSString * jsStr [NSStringstringWithFormat:@"payResult('%@')",@"true"];

[self.webView evaluateJavaScript:js StrcompletionHandler:^(id_Nullable result, NSError * _Nullable error) {

    NSLog(@"==%@----%@",result, error);

}];

}
使用evaluateJavaScript方法,可以传参也可不传参。

UIWebView

JS调用OC方法

代码:

  //创建JSContext对象
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//注册printHelloWorld方法
context[@"printHelloWorld"] = ^() {
        NSLog(@"Hello World !");
};
context[@"printAandB"] = ^(NSString *A ,NSString *B) {    
          NSLog(@"%@,%@",A,B);    
};

引入JavaScriptCore框架,使用JSContext对象。
其中的printHelloWorld、printAandB是网页中的JS方法名,NSString *A、NSString *B是通过printAandB方法传递给OC的参数。

OC调用JS

在UIWebView加载完成后调用

  JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; 
//OC调用JS方法    
 [context evaluateScript:@"test1()"];
调用方法传参数:
[context evaluateScript:@"test1(\"我是参数a\",\"我是参数b\")"];

本地html代码



    
    这是一个示例html文件
    
    
    


    

OC与JS交互

本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。

你可能感兴趣的:(iOS开发中OC与JS的交互)