JS中bridge的原理與封裝
一、hybird背景介紹
一般原生app發(fā)版周期長(zhǎng),而web版的app 開發(fā)速度快,周期短,所以hybird-H5 就是,web頁(yè)面嵌入到app 的webview中,把Bridge作為native 與 web 頁(yè)面溝通的橋梁。
1、借助原生可以實(shí)現(xiàn)以下能力
- 跳轉(zhuǎn)原生頁(yè)面
- 獲取原生數(shù)據(jù)
- 調(diào)用原生功能
- 其他
二、 我們可以看一下純H5和 app應(yīng)用之間的區(qū)別

三、JsBridge 原理以及實(shí)現(xiàn)方式
從詞意就了解到是js和Native與native之溝通的橋梁,實(shí)際上可以說(shuō)是一種通信方式,而這種方式也類比于JSONP的交互方式,只是類比的對(duì)象放到了js與native身上,Native通過橋來(lái)調(diào)用js的方法,相反js通過橋也能調(diào)起native的一些功能。
1、 JavaScript調(diào)用Native-注入API方式
通過WebView提供的接口,向JavaScript的window中注入對(duì)象或者方法,讓JavaScript調(diào)用時(shí),直接執(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)用的某個(gè)功能)
|
scheme://[path][?query]
| |
應(yīng)用標(biāo)識(shí) 功能需要的參數(shù)
前端的一個(gè)調(diào)用方式:
js直接請(qǐng)求定義好的bridge://loaded協(xié)議就能觸發(fā)native端的攔截
例如:
<href="bridge://loaded" rel="external nofollow" >觸發(fā)app</a>
3、兩種方式優(yōu)缺點(diǎn)
目前不建議只使用攔截URLScheme解析參數(shù)的形式,主要存在幾個(gè)問題:
- 連續(xù)調(diào)用location.href會(huì)出現(xiàn)消息丟失,因?yàn)閃ebView限制了連續(xù)跳轉(zhuǎn),會(huì)過濾掉后續(xù)的請(qǐng)求。
- URL會(huì)有長(zhǎng)度限制,一旦過長(zhǎng)就會(huì)出現(xiàn)信息丟失因此,類似WebViewJavaScriptBridge,JsBridge這類庫(kù),就結(jié)合了注入API的形式一起使用
四、 現(xiàn)有開源解決方案
- iOS: WebViewJavascriptBridge
- Android: JsBridge
五、我司使用的方案
我司主要使用的是注入API方式:
- 調(diào)用app的方法,并返回promise的結(jié)果
- 根據(jù)當(dāng)前的事件,注冊(cè)成功回調(diào),失敗回調(diào),掛載到window上
- 針對(duì)安卓和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
}
})
}注冊(cè)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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 微信瀏覽器內(nèi)置JavaScript對(duì)象WeixinJSBridge使用實(shí)例
- 微信內(nèi)置瀏覽器私有接口WeixinJSBridge介紹
- 微信WeixinJSBridge API使用實(shí)例
- Android中極簡(jiǎn)的js與java的交互庫(kù)(SimpleJavaJsBridge)
- iOS開發(fā)之WKWebViewJavascriptBridge Xcode9中導(dǎo)致crash的解決
- android和js的交互之jsbridge使用教程
- Flutter使用JsBridge方式處理Webview與H5通信的方法
- 如何通過Proxy實(shí)現(xiàn)JSBridge模塊化封裝
- Javascript之JSBridge初探
- 一篇文章學(xué)會(huì)jsBridge的運(yùn)行機(jī)制
相關(guān)文章
微信小程序項(xiàng)目實(shí)踐之九宮格實(shí)現(xiàn)及item跳轉(zhuǎn)功能
這篇文章主要介紹了微信小程序項(xiàng)目實(shí)踐之九宮格實(shí)現(xiàn)及item跳轉(zhuǎn)功能,需要的朋友可以參考下2018-07-07
java必學(xué)必會(huì)之static關(guān)鍵字
java必學(xué)必會(huì)之static關(guān)鍵字,static關(guān)鍵字是很多朋友在編寫代碼和閱讀代碼時(shí)碰到的比較難以理解的一個(gè)關(guān)鍵字,下面結(jié)合大家一起學(xué)習(xí)static關(guān)鍵字2015-12-12
JS+HTML5實(shí)現(xiàn)獲取手機(jī)驗(yàn)證碼倒計(jì)時(shí)按鈕
這篇文章主要介紹了基于JS+HTML5實(shí)現(xiàn)獲取手機(jī)驗(yàn)證碼倒計(jì)時(shí)按鈕,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
JavaScript解析任意形式的json樹型結(jié)構(gòu)展示
這篇文章主要介紹了JavaScript解析任意形式的json樹型結(jié)構(gòu)展示的相關(guān)資料,需要的朋友可以參考下2017-07-07
JS target與currentTarget區(qū)別說(shuō)明
target在事件流的目標(biāo)階段;currentTarget在事件流的捕獲,目標(biāo)及冒泡階段。只有當(dāng)事件流處在目標(biāo)階段的時(shí)候,兩個(gè)的指向才是一樣的,而當(dāng)處于捕獲和冒泡階段的時(shí)候,target指向被單擊的對(duì)象而currentTarget指向當(dāng)前事件活動(dòng)的對(duì)象(一般為父級(jí))。2011-08-08
JavaScript 實(shí)現(xiàn)同時(shí)選取多個(gè)時(shí)間段的方法
這篇文章主要介紹了JavaScript 實(shí)現(xiàn)同時(shí)選取多個(gè)時(shí)間段的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

