UIWebView & WKWebView的使用

加载函数

加载HTML、txt、word、PDF等内容。


image.png

网页导航

相关属性

image.png

相关方法

image.png

协议

UIWebViewDelegate与WKNavigationDelegate等效协议方法


image.png

两个 WebView(_:decidePolicyFor:decisionHandler:) 外表看着差不多,其实质的区别在于第一个参数
WKNavigationAction:网页信息
WKNavigationResponse:网页响应

WKNavigationDelegate余下一个协议方法

/* 开始获取到网页内容时返回 */
func WebView(WKWebView, didCommit: WKNavigation!)

WKScriptMessageHandler

用于App与JS交互,提供从web中收消息的回调方法,必须实现。


image.png

WKUIDelegate

用于处理输入、确认、警告提示框。在UIWebView中可以直接执行,WKWebView需要在此方法中接收JS通知并调用原生方法处理。


image.png

与JS交互

UIWebView与JS的交互

UIWebView与JS的交互是通过JavaScriptCore库中的JSContext对象。

JS调用原生代码

iOS7以前App通过WebView(_:shouldStartLoadWith:navigationType:) 代理方法拦截网络请求,并解析url参数,根据结果调用对应原生代码方法。
iOS7+ 通过官方的WebKit 的 JavaScript 引擎JavaScriptCore实现OC与JS互调,此方式可同步返回执行结果。

self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jsContext.exceptionHandler = ^(JSContext * con,JSValue * exception){
        NSLog(@"JS Error:%@",exception);
    };
原生代码调用JS

原生通过调用UIWebView的stringByEvaluatingJavaScript (from:)方法来调用JS代码

WKWebView与JS的交互

WKWebView与JS交互通过WKScriptMessageHandler协议的代理方法进行。web的window对象提供webkit对象实现共享,WKWebView通过指定WKUserContentControoler对象的scriptMessageHandler经过configuration参数绑定共享对象。handler对象通常为app内加载webview的控制器实现指定协议,JS端通过window.webKit.messageHandlers发送native消息时,协议方法被调用并传递参数,app端在协议方法根据参数值调用对应原生代码。

JS调用原生代码
  1. App内WKWebView通过userContentController注入JS。
  2. JS通过window.webkit.messageHandlers发送native消息,WKScriptMessageHandler代理函数userContentController: didReceiveScriptMessage被执行,App在代理方法中解析参数并调用对应原生代码即可。
原生调用JS代码
  1. App内WKWebView通过userContentController先注入JS代码或者JS已经实现约定的方法。
  2. 原生通过调用WKWebView的evaluateJavaScript(_:completionHandler:)方法调用JS代码。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容