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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章