問題:UIWebview重定向后,JSContext 注入的模型丟失問題
現(xiàn)象:js無法調(diào)起原生
我遇到這個問題之后,也是谷歌百度了很久很久。
github 找到一個開源項目
UIWebViewTS_JavaScriptContet
拉下來之后,只需要這樣就解決問題了

然后,有循環(huán)引用?
行,那這樣好了,注入模型

ok,現(xiàn)在來簡單分析一下是如何解決這個問題的。
其中,最關(guān)鍵的是一個回調(diào)方法
didCreateJavaScriptContext
作者通過 runtime 機制,巧妙地在 JavaScriptContext 創(chuàng)建之后,生成回調(diào)。然后在回調(diào)中我們注入mode,使其生效。重定向之后,重新生成context后再次回調(diào)這個方法,重新注入mode,重新生效。
詳細各位可以看 UIWebViewTS_JavaScriptContet 中 UIWebView+TS_JavaScriptContext.m 源碼
當我以為完美地解決了這個問題時,才發(fā)現(xiàn)這是一個坑啊!
他用了私有API,已有不少朋友深受其害。。。

當我無計可施的時候,在一個不起眼的答案中找到了解決思路,也正是本文要說的奇淫技巧。。
http://stackoverflow.com/questions/22714373/easyjswebview-breaks-when-reloading-the-webview
作者提出的是 EasyJSWebView 的一個崩潰問題


網(wǎng)友給出的解決辦法是將原來的UIWebView移除,重新生成一個UIWebView替換掉
針對我的問題,本著試一試的想法寫出了如下代碼:

重新生成了一個 UIWebView 結(jié)果問題解決了!
有個缺點就是,沒有了歷史記錄,不能使用 back 了!需要手動處理 返回,而且沒有緩存了。
對于我們的業(yè)務(wù),這些問題都還不算問題,所以也算是一個可以采用的解決方式。
分析
為什么我重新創(chuàng)建一個 UIWebView 再注入模型就可以了呢??
網(wǎng)上看到一位coder的猜測
- H5 一級頁面的時候,是 webView 第一次創(chuàng)建,在 webView loadRequest 之前,內(nèi)存已經(jīng) creat JavaScriptContext,也就說 在 UIWebViewDelegate 回調(diào)發(fā)生之前。
- 而跳轉(zhuǎn)到二級頁面,頁面只是 再次 回調(diào) UIWebViewDelegate ,這個時候,JavaScriptContext creat時機可能會晚于 - (BOOL)webView: shouldStartLoadWithRequest:navigationType: 也就是說回調(diào)發(fā)生的時候,新的 JavaScriptContext還未創(chuàng)建。
問題的關(guān)鍵是,我們注入模型的時機必須在創(chuàng)建 JavaScriptContext 與 JS調(diào)用 之間。