摘要:以這個工具庫作為依賴,只需要編寫實際通訊接口目前混合開發的方案包括就是一種簡單的解決方案。基于接口粒度的安全控制策略每一個實例也都會持有一個的實例,用于針對具體的開發接口設置安全檢查規則。
EasyBridge是一個簡單易用的js-bridge的工具庫,提供了日常開發中,JavaScript與Java之間通訊的能力,與其他常見的js-bridge工具庫實現方案不同,EasyBridge具備以下幾個特點:
基于Android WebView的addJavascriptInterface特性實現
提供了基于接口粒度的安全管理接口
輕量級,并且簡單易用。以這個工具庫作為依賴,只需要編寫實際通訊接口
Principle目前混合開發的方案包括:
JSBridge
Cordova
React Native
Flutter
EasyBridge就是一種簡單的JSBridge解決方案。在眾多的解決方案中,基本都是在利用系統的WebView所開放的接口,打開Java與JavaScript通訊的渠道,這些方案的實現原理分別包括:
攔截onJsPrompt()方法
當WebView中的頁面調用了JavaScript當中的window.prompt()方法的時候,這個方法會被回調。而且這個方法不僅能獲取到JavaScript傳遞過來的string字符串內容,同時也能返回一段string字符串內容被JavaScript接收到,是一個相當適合構建bridge的入口方法。
攔截shouldOverrideUrlLoading()方法
當頁面重新load URL或者頁面的iframe元素重新加載新的URL的時候,這個方法被回調。
addJavascriptInterface()接口
這個接口簡單卻強大,通過這個接口,我們能夠直接把Java中定義的對象在JavaScript中映射出一個對應的對象,使其直接調用Java當中的方法,但是,在android 4.1及之前的版本存在著嚴重的漏洞,所以一直被忽視。
EasyBridge在眾多的解決方案中,最終了選擇了addJavascriptInterface()接口作為方案的基礎,主要基于以下幾點考量:
目前Android版本已經到了9.0版本,市面上Android4.4之前的版本手機占有率已經很低,很多業務都已經把最低兼容版本定在了4.2以上,在這種情況下可以不考量4.1以下存在的漏洞問題;
addJavascriptInterface()能夠提供最簡單的同步調用
addJavascriptInterface()與evaluateJavascript()/loadUrl結合,能夠帶來更加簡單的異步調用的解決方案
方案結構EasyBridge的方案結構如下圖所示:
EasyBridge總共會向頁面中注入兩個JavaScript對象,:
easyBridge
在頁面加載到25%以上的時候(onProgressChanged()),通過執行工具庫中的一個js文件注入的。這個對象主要的作用是定義了業務頁面的JavaScript代碼調用native的Java代碼的規范入口,對象中定義的一個最關鍵的函數就是callHandler(handlerName, args, callback),這就是橋梁的入口。實際上在這個方法的內部,最終就是通過下面的_easybridge對象進入到Java代碼層。
_easybridge
通過addJavascriptInterface()映射和注入的一個對象,這個對象提供了實質的入口方法enqueue(),在這個方法當中代碼的路線從JavaScript層進入到了Java層,開啟了兩者的交互。
接口分發實際上,我們可以通過@JavascriptInterface注解開放很多的接口給JavaScript層調用,也可以通過addJavascriptInterface()映射多個Java對象到JavaScript層,但是為了維護簡單和通訊方便,EasyBridge的設計只提供了一個入口和一個出口。所有需要開放給JavaScript層的功能,都是通過構建接口實例進行處理。
接口的定義如下:
public interface BridgeHandler { String getHandlerName(); void onCall(String parameters, ResultCallBack callBack); SecurityPolicyChecker securityPolicyChecker(); }
實際的工作流程如下圖所示:
最開始初始化的時候需要注冊所有可以被JavaScript層調用的業務接口。在運行的過程中,enqueue()入口當中會根據協議定義,通過接口名稱找到對應的處理接口實例,并觸發接口響應。并且最終的接口響應都在入口處進行回傳。因此,實際上,_easybridge對象(在Java層中,其實是EasyBridge的實例)就是一個樞紐站,做任務的分派和結果的傳遞。
安全控制EasyBridge的安全檢查通過實現下面的接口對象來完成:
public interface SecurityPolicyChecker { boolean check(String url, String parameters); }
內部提供了兩級的安全控制策略,分別對應全局的安全控制策略和基于接口粒度的安全控制策略:
全局安全控制策略在EasyBridgeWebView對象當中,持有SecurityPolicyChecker用于進行全局的安全檢查。全局的安全檢查在EasyBridge的內部發生在以下兩個時機:
Java注入bridge的時候
根據當前加載的頁面url和參數信息,判斷是否需要在頁面中注入bridge。如果被安全規則攔截,則之前通過addJavaScriptInterface()注入的對象會被移除,也不會向頁面中注入bridge對象,確保安全。
JavaScript調用具體的Java接口的時候
在執行具體的Java開放的接口方法之前, 也會先觸發全局的安全檢查規則。
基于接口粒度的安全控制策略每一個BridgeHandler實例也都會持有一個SecurityPolicyChecker的實例,用于針對具體的開發接口設置安全檢查規則。每一個接口在接收到分派的指令之前,會先調用其安全控制策略,根據當前加載的頁面地址以及傳入的指令參數判斷是否需要進行指令的分派,否則將會直接命令安全受限,錯誤返回,結果調用。
Feture?? 注入jsbridge重試機制
?? 使用apt技術注冊handler
?? JavaScript調用Java功能
?? Java調用JavaScript功能
?? 安全控制策略
關于EasyBridge的feature的詳細說明以及整個工具庫的使用,可以參考我的GitHub倉庫中的說明。
整個工具庫比較簡單和小巧,歡迎大家對這種實現方案存在的問題提出改進的意見,謝謝
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69010.html
摘要:在此次大會中,全面闡釋了極簡產品背后蘊涵極深的技術,首次系統表達了自己的產品理念,而大會主視覺也始終緊貼著這一理念進行設計。視覺方向的探索本次大會最初的關鍵詞是簡和深,我們首先要做的是根據大會的主題關鍵詞,來提取出能表述大致畫面的視覺方向。2018年11月25日,UCloud用戶大會暨Think in Cloud 2018在上海如期召開。在此次大會中,UCloud全面闡釋了極簡產品背后蘊涵極...
摘要:模式記錄了已得到充分證明的既有設計經驗。模式有助于創建具有指定特征的軟件。每個模式都說明了運行階段的行為。應用設計模式不會影響軟件系統的基本架構,但可能嚴重影響子系統的架構。成例如何解決特定的設計問題。 學了這么久的設計模式,最近一直在看Node.js的設計模式,一直納悶為何會有模式這一類東西的存在,那么模式究竟是什么東西?后面在看了《面向模式的軟件架構》之后才慢慢知道有了一些系統的概...
摘要:難以通過重構手法完成設計的改動先想像重構的情況。何時不該重構現有代碼根本不能正常運作。現在,我可以修改這個子類而不必承擔午一中影響另一處的風險。 重構:對軟件內部結構的一種調整,目的是再不改變軟件的可觀察行為的前提下,提高其可理解性,降低其修改成本。 兩頂帽子 添加新功能 添加新功能時不應該修改既有代碼,只管添加新功能,通過測試重構 重構時你就不能再添加功能,只管改進程序結構,此時...
摘要:在他的重學前端課程中提到到現在為止,前端工程師已經成為研發體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學習。一基礎前端工程師吃飯的家伙,深度廣度一樣都不能差。 開篇 前端開發是一個非常特殊的行業,它的歷史實際上不是很長,但是知識之繁雜,技術迭代速度之快是其他技術所不能比擬的。 winter在他的《重學前端》課程中提到: 到現在為止,前端工程師已經成為研...
摘要:在他的重學前端課程中提到到現在為止,前端工程師已經成為研發體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學習。一基礎前端工程師吃飯的家伙,深度廣度一樣都不能差。開篇 前端開發是一個非常特殊的行業,它的歷史實際上不是很長,但是知識之繁雜,技術迭代速度之快是其他技術所不能比擬的。 winter在他的《重學前端》課程中提到: 到現在為止,前端工程師已經成為研發體系...
閱讀 3268·2021-11-18 10:02
閱讀 1470·2021-10-12 10:08
閱讀 1272·2021-10-11 10:58
閱讀 1287·2021-10-11 10:57
閱讀 1184·2021-10-08 10:04
閱讀 2139·2021-09-29 09:35
閱讀 789·2021-09-22 15:44
閱讀 1286·2021-09-03 10:30