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

三、JsBridge 原理以及實(shí)現(xiàn)方式
從詞意就了解到是js和Native與native之溝通的橋梁,實(shí)際上可以說是一種通信方式,而這種方式也類比于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)缺點(diǎn)
目前不建議只使用攔截URLScheme解析參數(shù)的形式,主要存在幾個問題:
- 連續(xù)調(diào)用location.href會出現(xiàn)消息丟失,因?yàn)閃ebView限制了連續(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使用實(shí)例
- 微信內(nèi)置瀏覽器私有接口WeixinJSBridge介紹
- 微信WeixinJSBridge API使用實(shí)例
- Android中極簡的js與java的交互庫(SimpleJavaJsBridge)
- iOS開發(fā)之WKWebViewJavascriptBridge Xcode9中導(dǎo)致crash的解決
- android和js的交互之jsbridge使用教程
- Flutter使用JsBridge方式處理Webview與H5通信的方法
- 如何通過Proxy實(shí)現(xiàn)JSBridge模塊化封裝
- Javascript之JSBridge初探
- 一篇文章學(xué)會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
JS+HTML5實(shí)現(xiàn)獲取手機(jī)驗(yàn)證碼倒計(jì)時按鈕
這篇文章主要介紹了基于JS+HTML5實(shí)現(xiàn)獲取手機(jī)驗(yàn)證碼倒計(jì)時按鈕,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
JavaScript解析任意形式的json樹型結(jié)構(gòu)展示
這篇文章主要介紹了JavaScript解析任意形式的json樹型結(jié)構(gòu)展示的相關(guān)資料,需要的朋友可以參考下2017-07-07
JS target與currentTarget區(qū)別說明
target在事件流的目標(biāo)階段;currentTarget在事件流的捕獲,目標(biāo)及冒泡階段。只有當(dāng)事件流處在目標(biāo)階段的時候,兩個的指向才是一樣的,而當(dāng)處于捕獲和冒泡階段的時候,target指向被單擊的對象而currentTarget指向當(dāng)前事件活動的對象(一般為父級)。2011-08-08
JavaScript 實(shí)現(xiàn)同時選取多個時間段的方法
這篇文章主要介紹了JavaScript 實(shí)現(xiàn)同時選取多個時間段的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

