iOS奇淫技巧 —— 解决UIWebView重定向后,JSContext 注入的模型丢失问题

问题:UIWebview重定向后,JSContext 注入的模型丢失问题
现象:js无法调起原生

我遇到这个问题之后,也是谷歌百度了很久很久。

github 找到一个开源项目
UIWebViewTS_JavaScriptContet
拉下来之后,只需要这样就解决问题了

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

然后,有循环引用?
行,那这样好了,注入模型
8F657EFC-C0C1-498F-BA81-9089E6428D53.png

ok,现在来简单分析一下是如何解决这个问题的。

其中,最关键的是一个回调方法didCreateJavaScriptContext
作者通过 runtime 机制,巧妙地在 JavaScriptContext 创建之后,生成回调。然后在回调中我们注入 mode,使其生效。重定向之后,重新生成context后再次回调这个方法,重新注入 mode,重新生效。

详细各位可以看 UIWebViewTS_JavaScriptContet 中 UIWebView+TS_JavaScriptContext.m 源码

当我以为完美地解决了这个问题时,才发现这是一个坑啊!

他用了私有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

网友给出的解决办法是将原来的UIWebView移除,重新生成一个UIWebView替换掉

针对我的问题,本着试一试的想法写出了如下代码:


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

重新生成了一个 UIWebView 结果问题解决了!

有个缺点就是,没有了历史记录,不能使用 back 了!需要手动处理 返回,而且没有缓存了。

对于我们的业务,这些问题都还不算问题,所以也算是一个可以采用的解决方式。

分析

为什么我重新创建一个 UIWebView 再注入模型就可以了呢??

网上看到一位coder的猜测

  • H5 一级页面的时候,是 webView 第一次创建,在 webView loadRequest 之前,内存已经 creat JavaScriptContext,也就说 在 UIWebViewDelegate 回调发生之前。
  • 而跳转到二级页面,页面只是 再次 回调 UIWebViewDelegate ,这个时候,JavaScriptContext creat时机可能会晚于 - (BOOL)webView: shouldStartLoadWithRequest:navigationType: 也就是说回调发生的时候,新的 JavaScriptContext还未创建。

问题的关键是,我们注入模型的时机必须在创建 JavaScriptContext 与 JS调用 之间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 16,304评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,716评论 25 708
  • 前言 关于UIWebView的介绍,相信看过上文的小伙伴们,已经大概清楚了吧,如果有问题,欢迎提问。 本文是本系列...
    CoderLF阅读 9,390评论 2 12
  • “我们的起跑线肯定是不同的,但是我让你100米,我还是有可能得冠军的。” 朱国营说他在求学过程中特别是高三在身体和...
    心灵育儿妈妈阅读 399评论 0 0
  • 在瞭望无际的新疆,有碧蓝无垠而不失干净的天空,有嫩白如初而不失情调的雪山,有地道淳朴而不失风韵的乡土风情,更有穿着...
    化骨真人阅读 406评论 0 1

友情链接更多精彩内容