Android JsBridge 的坑,registerHandler不执行,callHandler不执行

以下引用大佬的原话

在使用的过程中,起初遇到了一些bug, 是不敢相信的,毕竟4000多星的项目,近1000 fork,我所有项目加起来也没这么多啊。但是随着使用中遇到的越来越多的问题,我不得不仔细的看了看源码,结合现有的issue, 经过仔细反复的测试、验证,让我大为吃惊,发现此库不仅有一些不合理的地方,而且存在多个致命的问题。在此,先说严重的bug, 文末贴出了我自己实现的修复版,欢迎探讨:

致命的bug

  • (1).字符串转义bug。如issue #103 、#53、 #83、 #42、 #35、 #24、 #3、#6 ... 这些问题本质上的原因都是通过js bridge传递数据转义有误导致。 此bug会导致严重问题,如果传递的数据转义发生错误时,将导致不可用,像WebViewJavascriptBridge: WARNING: javascript handler threw.", source: (1) 这种错误很多时候都是因为js收到的数据和期望不符导致的异常(当然有些也有可能是js hanlder 处理不当抛出的)。这是一个偶现的致命bug 。要彻底解决这个问题最根本的方法就是不应该去转义,因为在传递数据格式未限定的情况下,只要转义,正常的数据字符串中都有可能匹配到转义规则(而这些字符串本身是不需要转义),这将会导致对于一部分数据能够正常转义,而一部分数据不能,这样的bug很难测试。 如果非要转义,就必须得限定jsbridge数据传递的格式,比如必须以json形式传递(不能直接传递string、bool等基础类型),这样才可以应用固定的转义规则解析。

  1. (2).Javascript调用原生方法会偶现失败。相同的问题如issue #96、#76、#111 在测试过程中发现,失败的时机往往是webview调用 onPageFinished 前后,具体的表现是js调用native方法时 shouldOverrideUrlLoading(包括两种重载)没有被触发,所以端上没有去刷新js调用的message queue. 至于为什么没有就调用shouldOverrideUrlLoading,这是因为js和webview通信机制有问题,通过改变iframe src属性的这种方式并不能保证shouldOverrideUrlLoading每次都会被调用,这也是一些其它android jsbridge 会出现此问题的原因。解决的办法很多,此处不赘述。

  2. (3).Java调用JS方法会偶现失败。相同的问题如issue #116、#89、#71 等,在经过分析之后,导致此问题的原因有两个(除过作者所述的 “maven 的方式添加这个库的话有问题,应该是js没有打包进去”):

  • 正如上面(1)中所述,是字符串转义的bug导致,这种情况下,js handler在收到java传递过来的数据时,仍然按照期望的数据格式处理,倘若在java传递数据之前的转义发生了错误,那么hanlder很可能会抛出异常,此时就会输出 WebViewJavascriptBridge: WARNING: javascript handler threw."...这种错误

详细地址: https://github.com/lzyzsd/JsBridge/issues/119

另外还有大佬的高级版DsBridge: https://github.com/wendux/WebViewJavascriptBridge 

你可能感兴趣的:(Android,第三方开源)