以下引用大佬的原話
在使用的過程中,起初遇到了一些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等基礎類型),這樣纔可以應用固定的轉義規則解析。
-
(2).Javascript調用原生方法會偶現失敗。相同的問題如issue #96、#76、#111 在測試過程中發現,失敗的時機往往是webview調用 onPageFinished 前後,具體的表現是js調用native方法時 shouldOverrideUrlLoading(包括兩種重載)沒有被觸發,所以端上沒有去刷新js調用的message queue. 至於爲什麼沒有就調用shouldOverrideUrlLoading,這是因爲js和webview通信機制有問題,通過改變iframe src屬性的這種方式並不能保證shouldOverrideUrlLoading每次都會被調用,這也是一些其它android jsbridge 會出現此問題的原因。解決的辦法很多,此處不贅述。
-
(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