苹果提醒称,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];
|