JSBridge的原理淺析與操作實踐

JSBridge是什麼

​ 顧名思義:就是JavaScript(H5)與Native通信的橋樑,在H5開發中經常有操作客戶端的需求,比如獲取App信息,打開/關閉一個WebView,吊起支付面板等等,但這些功能只能在Native中實現,因此誕生JSBridge,通過JSBridge與Native通信,賦予了JavaScript操作Native的能力,同時也給了Native調用JavaScript的能力。

JSBridge的原理淺析與操作實踐

​JSBridge與Native間通信原理

在H5中JavaScript調用Native的方式主要用兩種

1.注入API,注入Native對象或方法到JavaScript的window對象中(可以類比於RPC調用)。

2.攔截URL Schema,客戶端攔截WebView的請求並做相應的操作(可以類比於JSONP)。

下面將以Android端的JSBridge通信為例,講解這兩種方式的實現原理(本人比較菜,只會Java不會Swift和OC)。

注入API

通過WebView提供的接口,向JavaScript的window中注入對象或方法(Android使用addJavascriptInterface()方法),讓JavaScript調用時相當於執行相應的Native邏輯,達到JavaScript調用Native的效果。

對於Android實現方式如下,核心代碼在於

JSBridge的原理淺析與操作實踐

​示例如下

在Android的main頁面放一個Webview

JSBridge的原理淺析與操作實踐

​然後Android端對應的代碼如下

JSBridge的原理淺析與操作實踐

​對於JavaScript側,則可以直接調用Native端注入的InjectNativeObjec對象的方法

JSBridge的原理淺析與操作實踐

​實際效果如下,其中login按鈕點擊調用Native端openNewPage方法並傳相應的參數給客戶端。

JSBridge的原理淺析與操作實踐

​缺陷: Android4.2及以下的版本使用addJavascriptInterface方法有漏洞

該漏洞源於程序沒有正確限制使用WebView.addJavascriptInterface方法,遠程攻擊者可通過使用Java Reflection API利用該漏洞執行任意Java對象的方法,簡單的說就是通過addJavascriptInterface給WebView加入一個JavaScript橋接接口,JavaScript通過調用這個接口可以直接操作本地的Java接口。

在Android4.2以上提供@JavascriptInterface註解來規避該漏洞,但對於4.2以下版本則沒有任何方法。所以使用該方法有一定的風險和兼容性問題。

攔截URL Schema

H5端通過iframe.src或localtion.href發送Url Schema請求,之後Native(Android端通過shouldOverrideUrlLoading()方法)攔截到請求的Url Schema(包括參數等)進行相應的操作。

通俗點講就是,H5發一個普通的https請求可能是: https://daydream.com/?a=1&b=1, 而與客戶端約定的JSBridge Url Schema可能是: Daydream://jsBridgeTest/?data={a:1,b:2},客戶端可以通過schema來區分是JSBridge調用還是普通的https請求從而做不同的處理。

其實現過程原理類似於JSONP

1.首先在H5中注入一個callback方法,放在window對象中

JSBridge的原理淺析與操作實踐

然後把callback的名字通過Url Schema傳到Native

2.Native通過shouldOverrideUrlLoading(),攔截到WebView的請求,並通過與前端約定好的Url Schema判斷是否是JSBridge調用。

3.Native解析出前端帶上的callback,並使用下面方式調用callback

JSBridge的原理淺析與操作實踐

​或者

JSBridge的原理淺析與操作實踐

​通過上面幾步就可以實現JavaScript到Native的通信。下面可以看看處理Url Schema的攔截的shouldOverrideUrlLoading方法的相關例子

JSBridge的原理淺析與操作實踐

示例

Android頁面佈局

JSBridge的原理淺析與操作實踐

Android端代碼如下

JSBridge的原理淺析與操作實踐

JSBridge的原理淺析與操作實踐

​JavaScript側

window上掛載的方法在Native中可以使用webView.loadUrl() / webView.evaluateJavascript()調用

JSBridge的原理淺析與操作實踐

​基於JSONP原理可以定義JSBridge類

JSBridge的原理淺析與操作實踐

​JavaScript使用例子

JSBridge的原理淺析與操作實踐

​效果如下

JSBridge的原理淺析與操作實踐

​缺陷: 使用URL Schema有一定的長度問題,url過長可能會導致丟失; 一次JSBridge調用耗時可能比較長,創建請求需要一定的時間。

總結

本文簡單介紹了JSBridge以及在Android端的通信,通過相應的分析與代碼實現可以發現JSBridge原理其實並沒有那麼難,因此希望本文能對讀者對JSBridge有一定的理解,最後生活不止有前端,還有客戶端在等著咱o(T^T)o


分享到:


相關文章: