美文网首页iOS开发网络相关iOS Developer
iOS奇淫技巧 —— 解决UIWebView重定向后,JSCon

iOS奇淫技巧 —— 解决UIWebView重定向后,JSCon

作者: lfb_CD | 来源:发表于2017-02-23 22:34 被阅读1873次

    问题: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调用 之间。

    相关文章

      网友评论

      • 冰land:找了一天的解决方法,有朋友说可以考虑使用cookie来传值,但是H5那边不知道怎么获取我存的cookie,,,到最后还是要用移除UIWebView嘛?但是感觉会闪屏,真心不爽
        lfb_CD:H5那边可以用js获取cookie
      • 退役程序猿:最后结局了么?wk webview 也会出现么?
      • 爱上别的吧:在webview加载完成的代理方法里面生成jsContext再注入模型就好了吧
        lfb_CD:试过,不行的,所以才写了这篇文章。。

      本文标题:iOS奇淫技巧 —— 解决UIWebView重定向后,JSCon

      本文链接:https://www.haomeiwen.com/subject/qvtxbttx.html