1. 程式人生 > 其它 >js和native互動方法淺析

js和native互動方法淺析

一、背景

最近接觸公司專案,需要和原生app做互動,由此業務需求,開始了學習探索之路。

二、解決方案之WebViewJavascriptBridge 

想要和app互動,必須在app上先把bridge進行例項化,這是先決條件。

oc解決方案

步驟

1、引入檔案

#import "WebViewJavascriptBridge.h"

2、例項化WebViewJavascriptBridge 

self.bridge = [WebViewJavascriptBridge bridgeForWebView:webView];

3、在oc中註冊一個函式,並呼叫一個js處理函式 

[self.bridge registerHandler:@"ObjC Echo" handler:^(id data, WVJBResponseCallback responseCallback) {
    NSLog(@"ObjC Echo called with: %@", data);
    responseCallback(data);
}];
[self.bridge callHandler:@"JS Echo" data:nil responseCallback:^(id responseData) {
    NSLog(@"ObjC received response: %@", responseData);
}];

4、把這段js程式碼放入前端js或者頁面中 

 1 function setupWebViewJavascriptBridge(callback) {
 2     if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
 3     if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
 4     window.WVJBCallbacks = [callback];
 5 // 建立iframe 物件, 在網頁中,iframe的用法非常多,主要應用於偽ajax、巢狀頁面、頁面重用。
 6     var WVJBIframe = document.createElement('iframe');
 7     WVJBIframe.style.display = 'none';
 8     WVJBIframe.src = 'https://__bridge_loaded__';
 9     document.documentElement.appendChild(WVJBIframe);
10 //保證前面的程式碼執行完再刪除這個iframe節點,
11 //setTimeout (fn,0)
12 //同步程式碼轉非同步程式碼,這是為了手動調配優先順序不高的程式碼靠後執行。保證當前處於事件佇列中的任務全部執行完後該任務(函式)立刻得到執行。
13     setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
14 }

5、在前端呼叫

setupWebViewJavascriptBridge(function(bridge) {
    
    /* Initialize your app here */

    bridge.registerHandler('JS Echo', function(data, responseCallback) {
        console.log("JS Echo called with:", data)
        responseCallback(data)
    })
    bridge.callHandler('ObjC Echo', {'key':'value'}, function responseCallback(responseData) {
        console.log("JS received response:", responseData)
    })
})

API

oc呼叫js

// OC端 向 JS端 傳資料的回撥函式, 註冊 registerHandler(識別符號, 資料回撥閉包), 當OC端發起資料傳送,會呼叫 function(資料, OC端給的回撥函式) --------->handlerName要和OC端保持一致

js呼叫oc

bridge.callHandler("handlerName", data)

總結

互動前需要先對OC環境和JS環境進行初始化,JS環境的初始化通過Web頁面載入時傳送特定的URL來完成。

WebViewJavascriptBridge在OC端和JS端各自維護一個bridge物件來儲存開放給另一端的方法,以及自身呼叫另一端後的回撥方法。前者通過handlerName來對映,後者通過callBackId標識唯一性。方法呼叫時必定攜帶handlerName,若需要回調,還需攜帶callBackId。

WebViewJavascriptBridge中OC呼叫JS採用的是WebView提供的JS執行方法;而JS呼叫OC採用的是URL攔截的方式,OC端通過識別特定的URL來區分是否需要攔截,並做相應的邏輯處理。

android解決方案

安卓版外掛傳送門https://github.com/gzsll/WebViewJavascriptBridge,原理基本一致,沒有深入研究。

思考

WebViewJavascriptBridge還需要做IOS和Android的相容,那麼,還有沒有更好的方案呢?功夫不負有心人,我找到了DSBridge

三、解決方案之DSBridge

dsbridge最大的特點就是支援同步!中文文件傳送門:https://github.com/wendux/DSBridge-Android/blob/master/readme-chs.md

文章寫的比較淺,如有紕漏,歡迎指正,如果有更好方案,歡迎留言。