iOS 开源库源码分析之WebViewJavascriptBridge
WebViewJavascriptBridge_JS
WebViewJavascriptBridge_JS是需要注入JS的JS代码部分,主要是一个JS的WebViewJavascriptBridge对象,里面有registerHandler和callHandler方法。
这个代码会在JS载入的时候通过setupWebViewJavascriptBridge调用
WebViewJavascriptBridge
Objective-C调用JS的方法
可以查看Base提供的
_evaluateJavascript
在UIWebView的实现是通过stringByEvaluatingJavaScriptFromString方法来实现,在WKWebView中是调用evaluateJavaScript: completionHandler:。
这个方法在WebViewJavascriptBridge 和 WKWebViewJavascriptBridge 则通过callHandler方法来包装。
不过需要注意的是,在调用之前你要保证这个方法是有的,所以需要JS端先调用WebViewJavascriptBridge_JS的registerHandler来把方法和方法名作为keyvalue放入WebViewJavascriptBridge_JS的messageHandlers里面
JS调用Objective-C
JavaScript 能直接调用 native 方法吗?不可以。
首先JS端调用WebViewJavascriptBridge_JS的callHandler,这里会把方法键值对加入sendMessageQueue队列,并且赋值iframe的src
https://__wvjb_queue_message__/
以便ObjC识别自定义的消息.
但是可以间接的通过一些方法来实现。可以利用 UIWebView 的delegate方法 webView: shouldStartLoadWithRequest: navigationType: 来做。 WKWebView 中可以通过的delegate 方法 webView: decidePolicyForNavigationAction: decisionHandler: 来做.
webView 发起的网络请求都会走上面的代理方法,那么就可以在代理里拦截,如果返回的是我们自己定义的 URL ,就不再加载网页,而是来处理一些我们想让它做的事情,从而实现 native 和 JavaScript 的交互。
在代理方法里面会通过webViewJavascriptFetchQueyCommand拉取消息队列,然后序列化消息后拿到对应的消息去调用messageHandlers里面对应的handler.