一篇文章了解 JsBridge

2020-10-09 閃念基因

、jsbridge 定義

JSBridge 是一種 JS 實現的 Bridge,連接著橋兩端的 Native 和 H5。它在 APP 內方便地讓 Native 調用 JS,JS 調用 Native ,是雙向通信的通道。JSBridge 主要提供了 JS 調用 Native 代碼的能力,實現原生功能如查看本地相冊、打開攝像頭、指紋支付等。

二、JSBridge 用途

JSBridge 就像其名稱中的『Bridge』的意義一樣,是 Native 和非 Native 之間的橋梁,它的核心是 構建 Native 和非 Native 間消息通信的通道,而且是 雙向通信的通道。

雙向通信的通道:

1) JS 向 Native 發送消息: 調用相關功能、通知 Native 當前 JS 的相關狀態等。

2) Native 向 JS 發送消息: 回溯調用結果、消息推送、通知 JS 當前 Native 的狀態等。

H5與Native交互如下圖:

三、JSBridge 的實現原理

JavaScript 是運行在一個單獨的 JS Context 中(例如,WebView 的 Webkit 引擎、JSCore)。由於這些 Context 與原生運行環境的天然隔離,我們可以將這種情況與 RPC(Remote Procedure Call,遠程過程調用)通信進行類比,將 Native 與 JavaScript 的每次互相調用看做一次 RPC 調用。

在 JSBridge 的設計中,可以把前端看做 RPC 的客戶端,把 Native 端看做 RPC 的伺服器端,從而 JSBridge 要實現的主要邏輯就出現了:通信調用(Native 與 JS 通信) 和句柄解析調用。

四、JSBridge 的通信原理

一、JavaScript 調用 Native的方式

JavaScript 調用 Native 的方式,主要有兩種:注入 API 和 攔截 URL SCHEME。

1、注入API

注入 API 方式的主要原理是,通過 WebView 提供的接口,向JavaScript 的 Context(window)中注入對象或者方法,讓 JavaScript 調用時,直接執行相應的 Native 代碼邏輯,達到 JavaScript 調用 Native 的目的。

對於 iOS 的 UIWebView,實例如下:

JSContext *context = [uiWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; context[@"postBridgeMessage"] = ^(NSArray<NSArray *> *calls) { // Native 邏輯 }; 前端調用方式: window.postBridgeMessage(message); 

2、攔截 URL SCHEME

先解釋一下 URL SCHEME:URL SCHEME是一種類似於url的連結,是為了方便app直接互相調用設計的,形式和普通的 url 近似,主要區別是 protocol 和 host 一般是自定義的,

例如: qunarhy://hy/url?url=ymfe.tech,protocol 是 qunarhy,host 則是 hy。

攔截 URL SCHEME 的主要流程是:Web 端通過某種方式(例如 iframe.src)發送 URL Scheme 請求,之後 Native 攔截到請求並根據 URL SCHEME(包括所帶的參數)進行相關操作。

時間過程中,這種方式有一定的缺陷:

1) 使用 iframe.src 發送 URL SCHEME 會有 url 長度的隱患。

2) 創建請求,需要一定的耗時,比注入 API 的方式調用同樣的功能,耗時會較長。

因此:JavaScript 調用 Native 推薦使用注入 API 的方式

二、Native 調用 JavaScript 的方式

相比於 JavaScript 調用 Native, Native 調用 JavaScript 較為簡單,直接執行拼接好的 JavaScript 代碼即可。

從外部調用 JavaScript 中的方法,因此 JavaScript 的方法必須在全局的 window 上。

對於 iOS 的 UIWebView,示例如下:

result = [uiWebview stringByEvaluatingJavaScriptFromString:javaScriptString]; * javaScriptString為JavaScript 代碼串 

對於 iOS 的 WKWebView,示例如下:

[wkWebView evaluateJavaScript:javaScriptString completionHandler:completionHandler]; 

三、通信原理總結

通信原理是 JSBridge 實現的核心

1)JavaScript 調用 Native 推薦使用 注入 API 的方式(iOS6 忽略,Android 4.2以下使用 WebViewClient 的 onJsPrompt 方式)。

2)Native 調用 JavaScript 則直接執行拼接好的 JavaScript 代碼即可。

四、JSBridge 接口實現

JSBridge 的接口主要功能有兩個:調用 Native(給 Native 發消息) 和 被 Native 調用(接收 Native 消息)。因此,JSBridge 可以設計如下:

window.JSBridge = {   // 調用 Native   invoke: function(msg) {     // 判斷環境,獲取不同的 nativeBridge     nativeBridge.postMessage(msg);   },   receiveMessage: function(msg) {     // 處理 msg   } }; 

在上面的文章中,提到過 RPC 中有一個非常重要的環節是 句柄解析調用 ,這點在 JSBridge 中體現為 句柄與功能對應關係。同時,我們將句柄抽象為 橋名(BridgeName),最終演化為 一個 BridgeName 對應一個 Native 功能或者一類 Native 消息。基於此點,JSBridge 的實現可以優化為如下:

window.JSBridge = {   // 調用 Native   invoke: function(bridgeName, data) {   // 判斷環境,獲取不同的 nativeBridge     nativeBridge.postMessage({       bridgeName: bridgeName,       data: data || {}     });   },   receiveMessage: function(msg) {     var bridgeName = msg.bridgeName,     data = msg.data || {};   // 具體邏輯   } }; 

對於 JSBridge 的 Callback ,其實就是 RPC 框架的回調機制。當然也可以用更簡單的 JSONP 機制解釋:

當發送 JSONP 請求時,url 參數裡會有 callback 參數,其值是 當前頁面唯一 的,而同時以此參數值為 key 將回調函數存到 window 上,隨後,伺服器返回 script 中,也會以此參數值作為句柄,調用相應的回調函數。

整體流程:

在 Native 端配合實現 JSBridge 的 JavaScript 調用 Native 邏輯也很簡單,主要的代碼邏輯是:接收到 JavaScript 消息 => 解析參數,拿到 bridgeName、data 和 callbackId => 根據 bridgeName 找到功能方法,以 data 為參數執行 => 執行返回值和 callbackId 一起回傳前端。

Native調用 JavaScript 也同樣簡單,直接自動生成一個唯一的 ResponseId,並存儲句柄,然後和 data 一起發送給前端即可。

五、JSBridge 如何引用

對於 JSBridge 的引用,常用有兩種方式,各有利弊。

1) 由 Native 端進行注入

注入方式和 Native 調用 JavaScript 類似,直接執行橋的全部代碼。

優點:橋的版本很容易與 Native 保持一致,Native 端不用對不同版本的 JSBridge 進行兼容;與此同時,

缺點:注入時機不確定,需要實現注入失敗後重試的機制,保證注入的成功率,同時 JavaScript 端在調用接口時,需要優先判斷 JSBridge 是否已經注入成功。

2) 由 JavaScript 端引用

直接與 JavaScript 一起執行。與由 Native 端注入正好相反。

優點:JavaScript 端可以確定 JSBridge 的存在,直接調用即可;

缺點:如果橋的實現方式有更改,JSBridge 需要兼容多版本的 Native Bridge 或者 Native Bridge 兼容多版本的 JSBridge。

相關焦點

  • Android交互庫SimpleJavaJsBridge
    我會按以下順序進行本文章:1.現有js與java通信方案及不足先來說明一點js與java通信,指的是js既可以給java發送消息,同時java也可以給js發送消息。那就來屢屢它們之間的通信方案。(&34;);調用方法非常的簡單,&34;+js方法的名字+方法的參數值 拼接成一個字符串就可以給js發送消息了,猶如是在直接調用js的方法。
  • 一篇文章讓你徹底了解 JS 原型鏈
    了解了構造函數的 prototype 屬性之後。一定就會明白為什麼第一句是 true 了當通過"Animal.prototype.proto"語句獲取dog 對象原型的原型時候,將得到"Object{}"對象,後面將會看到所有對象的原型都將追溯到"Object{}"對象。對於原型對象"Animal.prototype"對象的"constructor"根據前面的介紹,將對應 Animal 函數本身。
  • anime.js實現logo動畫
    之前無聊瀏覽特效的時候,發現了anime.js的logo動畫特效,於是也想整個自己的logo動畫。通過以上介紹能夠稍微理解path作用,了解更多請瀏覽作者的另一篇文章SVG深入淺出第二個難點 賽貝爾曲線在我了解了SVG的大致原理後,自以為已經接近成功的大門。於是用ps做了一幅png格式的logo圖片
  • 邏輯層js文件(下)
    回顧上一篇文章,我們開始對小程序文件中具體的代碼構成進行分析,首先對邏輯層即js文件進行了分析。下面我們繼續對邏輯層js文件進行分析。(由於該自媒體,對於帶序號的文章,不支持,容易扣分,所以本文題目中不再標有序號)(昨天發文,由於被該媒體認定為有推廣意圖,所以沒發,非常抱歉)1. js與wxml之間的數據交互js文件的功能是實現小程序頁面與後臺的交互功能,必定涉及到數據的交互,即,數據怎麼傳輸到.wxml文件,(數據不會與.wxss文件進行交互,.wxss文件只負責樣式,後續我們會對
  • bridge用法,bridge the gap是什麼意思
    今天我們來學習bridge的用法。The bridge broke down in last earthquake.這座橋在上次地震中塌了。The only access to the city is across the bridge.到這座城市的唯一通道是過橋。
  • 通過構建自己的JavaScript測試框架來了解JS測試
    我們創建一個Node項目:mkdir examplesmkdir examples/mathcd examples/mathnpm init -y創建一個src文件夾並添加add.js和sub.jsmkdir srctouch src/add.js
  • 一篇文章寫完啦
    因為我必須趕在零點前把文章發布。因為微信公眾號每天只可以發一條。還有一些時候,寫著寫著竟然睡著了,而且還是站著打字。就在剛要睡著的那一瞬間大腦又清醒過來。於是又繼續打字,然後又在一瞬間又打起了瞌睡。一篇文章就這樣在半夢半醒中寫完了。在那些晚上,為了寫出一篇文章,也真是歷盡千山萬險,用盡各種招數。
  • 攝影后期,bridge基本調整流程,照片銳化及降噪讓照片更吸引眼球
    上一篇文章我大致帶大家了解了一下關於adobe bridge對於處理數字底片的過程是不傷底片的,所以bridge一定要用,有些網友可能對lightroom有一些了解,想知道關於lightroom的有關知識點,可以告訴大家,bridge和lightroom兩款軟體,只要學會了其中一個,另外一個就不攻自破了
  • 「Vue.js開發連載二」Vue.js定義
    上一篇文章講解「Vue.js的簡介」,本篇文章講解「Vue.js定義」。開發工具1. 在線代碼預覽平臺2.在Vue.js中,所綁定的標籤id的值,一般均為app,因此為了統一,我們都把id設置為app。2. el:'#app'中,#app遵循的規則為css選擇器規則。3. 如果使用JSRUN在線編輯器,需要選擇Vue的版本;如果使用vscode編輯器,要引入vue文件,引入開發版本(遇到錯誤會給出警告)。
  • 使用GPU.js改善JavaScript性能
    在該初學者指南中,我們將演示如何使用GPU.js執行複雜的數學計算並提高JavaScript應用的性能。什麼是GPU.js?GPU.js是一個針對Web和Node.js構建的JavaScript加速庫,用於在圖形處理單元(GPGPU)上進行通用編程,它使你可以將複雜且耗時的計算移交給GPU而不是CPU,以實現更快的計算和操作。
  • 一篇文章教會你創建vue項目和使用vue.js實現數據增刪改查
    4)安裝npm(npm全稱為 Node Package Manager是一個基於Node.js的包管理器,也是整個Node.js社區最流行、支持的第三方模塊最多的包管理器)。本網站在收到上述法律文件後,將會依法儘快聯繫相關文章源頭核實,溝通刪除相關內容或斷開相關連結。 )
  • 一篇關於了解我的文章
    (對的,在創辦這個公眾號之前,我已經日更297篇文章了)文章裡寫著我對生活的覺察,寫著我對舞蹈的理解,同時還會分享一些舞蹈上的教學筆記。我寫文章的目的之一,就是更好地感受到自己所感,更好地覺察自己度過的每一天。沒有察覺的人生,每日雖忙忙碌碌,卻像被困在灰色迷宮中的蟻,混沌不知白天黑夜。當我們能把注意力更多地放在自己身上,去完整的「看見」自己,你沉睡已久的內在自己,就將會甦醒。
  • 一篇文章全面了解Java反射機制
    Java的反射機制在實踐中可謂無處不在,如果你已經工作幾年,還對Java的反射機制一知半解,那麼這篇文章絕對值得你讀一讀。什麼是反射反射 (Reflection) 是Java的特徵之一,它允許運行中的Java程序獲取自身的信息,並且可以操作類或對象的內部屬性。
  • 說唱歌手bridge結婚網友祝福!bridge是誰個人資料介紹老婆照片曝光
    10月8日,網曝說唱歌手bridge結婚了!不過說到唱歌手bridge估計很多人不太熟悉,他到底是誰?怎麼出名的?又唱過哪些歌呢?bridge的老婆是誰呢?跟著小編一起來了解一下bridge這個人吧!
  • Burn the bridge?
    Hence, you better save such tactics as 「skipping breakfast, burning the bridge, or burning the boat (same as burning the bridge)」 for extreme circumstances.
  • 一篇文章深入為你剖析
    我將在下面的文章進行深入分析一下。幾種技術方案webview利用 安卓和 iOS 上的 webview 容器,APP 能夠執行 html、css 和 js如果需要原生功能就添加 bridge 供 javascript 調用。具有開發效率高、跨平臺、支持動態發布等特點,它是目前應用最廣泛最成熟的一種方案。React Native/WeexReact Native 和 Weex 這類方案,使用 javascript 來構建界面,在運行時翻譯成原生組件展示出來,實際上所有界面都是用原生組件。
  • bridge妻子是誰照片及個人資料微博曝光 bridge曬照公布結婚網友炸了
    bridge妻子是誰照片及個人資料微博曝光 bridge曬照公布結婚網友炸了時間:2018-10-08 19:29   來源:今日頭條   責任編輯:毛青青 川北在線核心提示:原標題:bridge妻子是誰照片及個人資料微博曝光 bridge曬照公布結婚網友炸了 去年一檔《中國有嘻哈》燃氣了一股嘻哈風,同時嘻哈歌手陸續走紅,今天
  • 記錄微信公眾號歷史文章採集(二、js代碼完善和資料庫建立)
    這系列的文章也是為了延續這份分享精神!該系列文章是根據知乎專題的教程一步一步實現過程,以及實現過程中踩過的一些坑。關於原理介紹這裡就不重複了,大家可以參考知乎專題。代碼完善前準備原作者用的是php環境,這裡有能力的可以嘗試其他語言實現,python、java等都可以,不過原作者已經給出一部分的php代碼,這裡也採用php來實現。
  • 一篇文章帶你了解CSS 分頁實例
    簡介: 一篇文章帶你了解用豐富的案例幫助大家更好地去了解對象,最後以「麵包屑導航 」作為小項目,使用Html程式語言,對前面介紹效果做一個總體的整合,方便大家增加對類和對象的認識,希望對大家的學習有幫助。原文連結:https://developer.aliyun.com/article/776816?
  • 使用 jsDelivr 免費加速 GitHub Pages
    之前寫過一篇 ,在那之後,又陸續想到並實施了幾點利用 jsDelivr 進一步加速靜態資源加載的措施,新起一篇作為記錄和分享。繼上一輪改造過後,比較拖頁面加載速度的主要有三點:頁面首個請求響應時間;圖片資源加載時間;站內搜索引用的 JSON 資源加載時間。