瀏覽器攔截請(qǐng)求
通過(guò)JS里面創(chuàng)建一個(gè)iframe窗口
改變iFrame的src, 相當(dāng)于瀏覽器實(shí)現(xiàn)了跳轉(zhuǎn)
因此native可以捕獲到這個(gè)網(wǎng)絡(luò)請(qǐng)求
然后通過(guò)url判斷是普通的跳轉(zhuǎn)還是bridge的跳轉(zhuǎn)
OC要調(diào)用javascript環(huán)境的方法细办,其實(shí)就是調(diào)用ExampleApp.html中的bridge.registerHandler注冊(cè)的方法阱洪。
總結(jié)
分別在OC環(huán)境和javascript環(huán)境都保存一個(gè)bridge對(duì)象夺谁,里面維持著requestId,callbackId,以及每個(gè)id對(duì)應(yīng)的具體實(shí)現(xiàn)。
OC通過(guò)javascript環(huán)境的window.WebViewJavascriptBridge對(duì)象來(lái)找到具體的方法剃氧,然后執(zhí)行。
javascript通過(guò)改變iframe的src來(lái)出發(fā)webview的代理方法webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler從而實(shí)現(xiàn)把javascript消息發(fā)送給OC這個(gè)功能够掠。
其實(shí)這里只是解析了webview與OC交互的橋接問(wèn)題赂蕴,其他比如webview中的請(qǐng)求攔截、添加進(jìn)度條唱捣、運(yùn)營(yíng)商劫持两蟀、如何組織交互規(guī)則等問(wèn)題這里還沒(méi)有涉及。這些在我們項(xiàng)目中運(yùn)用震缭,具體就不抽出來(lái)了赂毯。
https://segmentfault.com/a/1190000008948594
http://www.reibang.com/p/c895c4bc30fa