iOS奇淫技巧 —— 解決UIWebView重定向后,JSContext 注入的模型丟失問題

問題:UIWebview重定向后,JSContext 注入的模型丟失問題
現(xiàn)象:js無法調(diào)起原生

我遇到這個問題之后,也是谷歌百度了很久很久。

github 找到一個開源項目
UIWebViewTS_JavaScriptContet
拉下來之后,只需要這樣就解決問題了

58E3AD82-B82E-4AE6-AE0F-3383B08F5C56.png

然后,有循環(huán)引用?
行,那這樣好了,注入模型
8F657EFC-C0C1-498F-BA81-9089E6428D53.png

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,已有不少朋友深受其害。。。

AFA0A099-9C89-449B-9B0C-92BDFEDC630A.png

當我無計可施的時候,在一個不起眼的答案中找到了解決思路,也正是本文要說的奇淫技巧。。

http://stackoverflow.com/questions/22714373/easyjswebview-breaks-when-reloading-the-webview

作者提出的是 EasyJSWebView 的一個崩潰問題

3edc3db9116df2911342d4919df01708.png

6687FE24-1144-491F-8DCD-73973AB87324.png

網(wǎng)友給出的解決辦法是將原來的UIWebView移除,重新生成一個UIWebView替換掉

針對我的問題,本著試一試的想法寫出了如下代碼:


1BE8AE9C-47F1-4883-8BC5-F6A3A33FBACF.png

重新生成了一個 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)用 之間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,300評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評論 25 709
  • 前言 關(guān)于UIWebView的介紹,相信看過上文的小伙伴們,已經(jīng)大概清楚了吧,如果有問題,歡迎提問。 本文是本系列...
    CoderLF閱讀 9,341評論 2 12
  • “我們的起跑線肯定是不同的,但是我讓你100米,我還是有可能得冠軍的?!?朱國營說他在求學(xué)過程中特別是高三在身體和...
    心靈育兒媽媽閱讀 392評論 0 0
  • 在瞭望無際的新疆,有碧藍無垠而不失干凈的天空,有嫩白如初而不失情調(diào)的雪山,有地道淳樸而不失風韻的鄉(xiāng)土風情,更有穿著...
    化骨真人閱讀 404評論 0 1

友情鏈接更多精彩內(nèi)容