OC 与JS交互

发表于:,更新于:,By smmchn
大纲
  1. 1. JS调用OC
  2. 2. OC调用JS

苹果提醒称,2020年4月起App Store将不再接受使用UIWebView的新App,2020年12月起将不再接受使用UIWebView的App更新。

那么WKWebView有什么优势呢?

1
2
3
4
1. 在性能/稳定性.占用内存方面有很大的提升;
2. 允许JavaScript的Nitro库加载并使用(UIWebView中限制)
3. 增加夹杂唉进度属性:estimatedprogress, 不用再自己写假进度条了.
4. 支持了更多的HTML的属性

下面简单的写了一下用法:

#JS和OC的交互

JS调用OC

这个实现主要是依靠WKScriptMessageHandler协议类和WKUserContentController两个类:WKUserContentController对象负责注册JS方法,设置处理接收JS方法的代理,代理遵守WKScriptMessageHandler,实现捕捉到JS消息的回调方法,详情可以看第一步中对这两个类的介绍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//这个类主要用来做native与JavaScript的交互管理
WKUserContentController * wkUController = [[WKUserContentController alloc] init];
//注册一个name为jsToOcNoPrams的js方法,设置处理接收JS方法的代理
[wkUController addScriptMessageHandler:self name:@"jsToOcNoPrams"];
[wkUController addScriptMessageHandler:self name:@"jsToOcWithPrams"];
config.userContentController = wkUController;

注意:遵守WKScriptMessageHandler协议,代理是由WKUserContentControl设置
//通过接收JS传出消息的name进行捕捉的回调方法 js调OC
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"name:%@\\\\n body:%@\\\\n frameInfo:%@\\\\n",message.name,message.body,message.frameInfo);
}
//根据name移除所注入的scriptMessageHandler
- (void)removeScriptMessageHandlerForName:(NSString *)name;
//移除所有脚本
- (void)removeAllUserScripts;

JS代码实现如下

1
2
3
window.webkit.messageHandlers.<name>.postMessage(<messageBody>) 
name: OC端与JS端共同定义的方法名称
messageBody: 返回给OC的内容, 可以为字典和数组等,如果为空的时候,最好定一个空的对象,不要什么也不加,可能会造成OC端无法响应.

OC调用JS

1
2
3
4
5
6
7
8
//OC调用JS  changeColor()是JS方法名,completionHandler是异步回调block
NSString *jsString = [NSString stringWithFormat:@"changeColor('%@')", @"Js参数"];
[_webView evaluateJavaScript:jsString completionHandler:^(id _Nullable data, NSError * _Nullable error) {
NSLog(@"改变HTML的背景色");
}];
//改变字体大小 调用原生JS方法
NSString *jsFont = [NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%d%%'", arc4random()%99 + 100];
[_webView evaluateJavaScript:jsFont completionHandler:nil];