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.

results matching ""

    No results matching ""