JS中bridge的原理與封裝
一、hybird背景介紹
一般原生app發(fā)版周期長,而web版的app 開發(fā)速度快,周期短,所以hybird-H5 就是,web頁面嵌入到app 的webview中,把Bridge作為native 與 web 頁面溝通的橋梁。
1、借助原生可以實現(xiàn)以下能力
- 跳轉(zhuǎn)原生頁面
- 獲取原生數(shù)據(jù)
- 調(diào)用原生功能
- 其他
二、 我們可以看一下純H5和 app應(yīng)用之間的區(qū)別
三、JsBridge 原理以及實現(xiàn)方式
從詞意就了解到是js和Native與native之溝通的橋梁,實際上可以說是一種通信方式,而這種方式也類比于JSONP的交互方式,只是類比的對象放到了js與native身上,Native通過橋來調(diào)用js的方法,相反js通過橋也能調(diào)起native的一些功能。
1、 JavaScript調(diào)用Native-注入API方式
通過WebView提供的接口,向JavaScript的window中注入對象或者方法,讓JavaScript調(diào)用時,直接執(zhí)行相應(yīng)的Native代碼邏輯,達(dá)到JavaScript調(diào)用Native的目的。
前端執(zhí)行調(diào)用方式:
ioswindow.jsSendMessage(message); androidwindow.jsSendMessage.getNativeData()
2、JavaScript調(diào)用Native-攔截URLSCHEME
行為(應(yīng)用的某個功能) | scheme://[path][?query] | | 應(yīng)用標(biāo)識 功能需要的參數(shù)
前端的一個調(diào)用方式:
js直接請求定義好的bridge://loaded協(xié)議就能觸發(fā)native端的攔截
例如:
<href="bridge://loaded" rel="external nofollow" >觸發(fā)app</a>
3、兩種方式優(yōu)缺點
目前不建議只使用攔截URLScheme解析參數(shù)的形式,主要存在幾個問題:
- 連續(xù)調(diào)用location.href會出現(xiàn)消息丟失,因為WebView限制了連續(xù)跳轉(zhuǎn),會過濾掉后續(xù)的請求。
- URL會有長度限制,一旦過長就會出現(xiàn)信息丟失因此,類似WebViewJavaScriptBridge,JsBridge這類庫,就結(jié)合了注入API的形式一起使用
四、 現(xiàn)有開源解決方案
- iOS: WebViewJavascriptBridge
- Android: JsBridge
五、我司使用的方案
我司主要使用的是注入API方式:
- 調(diào)用app的方法,并返回promise的結(jié)果
- 根據(jù)當(dāng)前的事件,注冊成功回調(diào),失敗回調(diào),掛載到window上
- 針對安卓和ios, 需要兼容數(shù)據(jù)格式
- 在根據(jù)安卓和ios判斷執(zhí)行不同的方法
- Android 傳送字符串
- iOS 傳送 json
代碼如下: 核心邏輯如下
if (isAndroid) { data = JSON.stringify(data) // 安卓掛載的方法 window.JSActionBridge.handlerAction( event, data, successName, failName ) } if (isIOS) { // ios掛載的方法 window.webkit.messageHandlers.JSActionBridge.postMessage({ method: 'handlerAction', data: { actionEvent: event, paramsJsonValue: data, successCallback: successName, errorCallback: failName } }) }
注冊app 調(diào)用的方法:
registerFn (fnName, fn) { if (typeof fnName !== 'string') { throw TypeError('Illegal fnName: Not an string') } if (typeof fn !== 'function') { throw TypeError('Illegal fn: Not an function') } window[fnName] = function (data) { if (isIOS) { fn(data) } if (isAndroid) { data = data || '{}' fn(JSON.parse(data)) } } },
注銷app調(diào)用的方法:
unregisterFn (fnName) { if (typeof fnName !== 'string') { throw TypeError('Illegal fnName: Not an string') } delete window[fnName] },
到此這篇關(guān)于JS中bridge的原理與封裝的文章就介紹到這了,更多相關(guān)JS bridge內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 微信瀏覽器內(nèi)置JavaScript對象WeixinJSBridge使用實例
- 微信內(nèi)置瀏覽器私有接口WeixinJSBridge介紹
- 微信WeixinJSBridge API使用實例
- Android中極簡的js與java的交互庫(SimpleJavaJsBridge)
- iOS開發(fā)之WKWebViewJavascriptBridge Xcode9中導(dǎo)致crash的解決
- android和js的交互之jsbridge使用教程
- Flutter使用JsBridge方式處理Webview與H5通信的方法
- 如何通過Proxy實現(xiàn)JSBridge模塊化封裝
- Javascript之JSBridge初探
- 一篇文章學(xué)會jsBridge的運(yùn)行機(jī)制
相關(guān)文章
使用JavaScript和CSS實現(xiàn)簡單的字符計數(shù)器
在本文中,你將學(xué)習(xí)如何使用?JavaScript?創(chuàng)建字符計數(shù)器。計數(shù)的數(shù)字可以在小顯示屏中看到。文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08Javascript 5種方法實現(xiàn)過濾刪除前后所有空格
這篇文章主要介紹Javascript 5種過濾刪除前后所有空格的方法,比較實用,需要的朋友可以參考下。2016-06-06JS信息收集代碼研究(獲取客戶端的瀏覽器、cpu等軟硬件信息)
聽朋友說,這段JavaScript信息收集代碼主要用于收集IP......等等什么的,用來研究,需要的朋友可以參考一下2023-06-06