問題:UIWebview重定向后,JSContext 注入的模型丟失問題
現(xiàn)象:js無法調起原生
我遇到這個問題之后,也是谷歌百度了很久很久欢嘿。
github
找到一個開源項目
UIWebViewTS_JavaScriptContet
拉下來之后,只需要這樣就解決問題了
然后,有循環(huán)引用楷怒?
行,那這樣好了瓦灶,注入模型
ok鸠删,現(xiàn)在來簡單分析一下是如何解決這個問題的。
其中贼陶,最關鍵的是一個回調方法
didCreateJavaScriptContext
作者通過 runtime 機制刃泡,巧妙地在 JavaScriptContext 創(chuàng)建之后,生成回調碉怔。然后在回調中我們注入mode
烘贴,使其生效。重定向之后撮胧,重新生成context后再次回調這個方法桨踪,重新注入mode
,重新生效芹啥。
詳細各位可以看 UIWebViewTS_JavaScriptContet 中 UIWebView+TS_JavaScriptContext.m 源碼
當我以為完美地解決了這個問題時锻离,才發(fā)現(xiàn)這是一個坑啊叁征!
他用了私有API纳账,已有不少朋友深受其害。捺疼。疏虫。
當我無計可施的時候,在一個不起眼的答案中找到了解決思路,也正是本文要說的奇淫技巧卧秘。呢袱。
http://stackoverflow.com/questions/22714373/easyjswebview-breaks-when-reloading-the-webview
作者提出的是 EasyJSWebView
的一個崩潰問題
網友給出的解決辦法是將原來的UIWebView移除,重新生成一個UIWebView替換掉
針對我的問題翅敌,本著試一試的想法寫出了如下代碼:
重新生成了一個 UIWebView
結果問題解決了羞福!
有個缺點就是,沒有了歷史記錄蚯涮,不能使用 back
了治专!需要手動處理 返回,而且沒有緩存了遭顶。
對于我們的業(yè)務张峰,這些問題都還不算問題,所以也算是一個可以采用的解決方式棒旗。
分析
為什么我重新創(chuàng)建一個 UIWebView
再注入模型就可以了呢喘批??
網上看到一位coder
的猜測
- H5 一級頁面的時候铣揉,是 webView 第一次創(chuàng)建饶深,在 webView loadRequest 之前,內存已經 creat JavaScriptContext逛拱,也就說 在 UIWebViewDelegate 回調發(fā)生之前敌厘。
- 而跳轉到二級頁面,頁面只是 再次 回調 UIWebViewDelegate 橘券,這個時候额湘,JavaScriptContext creat時機可能會晚于 - (BOOL)webView: shouldStartLoadWithRequest:navigationType: 也就是說回調發(fā)生的時候,新的 JavaScriptContext還未創(chuàng)建旁舰。
問題的關鍵是,我們注入模型的時機必須在創(chuàng)建 JavaScriptContext
與 JS調用 之間嗡官。