国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一篇文章了解 JsBridge

開發
近些年,移動端普及化越來越高,開發過程中選用 Native 還是 H5 一直是熱門話題。Native 和 H5 都有著各自的優缺點,為了滿足業務的需要,公司實際項目的開發過程中往往會融合兩者進行 Hybrid 開發。Native 和 H5 分處兩地,看起來無法聯系,那么如何才能讓雙方協同實現功能呢?

                   [[345068]]

、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,實例如下:

  1. JSContext *context = [uiWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; 
  2. context[@"postBridgeMessage"] = ^(NSArray<NSArray *> *calls) { 
  3. // Native 邏輯 
  4. }; 
  5. 前端調用方式: 
  6. 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,示例如下:

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

對于 iOS 的 WKWebView,示例如下:

  1. [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 可以設計如下:

  1. window.JSBridge = { 
  2.   // 調用 Native 
  3.   invoke: function(msg) { 
  4.     // 判斷環境,獲取不同的 nativeBridge 
  5.     nativeBridge.postMessage(msg); 
  6.   }, 
  7.   receiveMessage: function(msg) { 
  8.     // 處理 msg 
  9.   } 
  10. }; 

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

  1. window.JSBridge = { 
  2.   // 調用 Native 
  3.   invoke: function(bridgeName, data) { 
  4.   // 判斷環境,獲取不同的 nativeBridge 
  5.     nativeBridge.postMessage({ 
  6.       bridgeName: bridgeName, 
  7.       data: data || {} 
  8.     }); 
  9.   }, 
  10.   receiveMessage: function(msg) { 
  11.     var bridgeName = msg.bridgeName, 
  12.     data = msg.data || {}; 
  13.   // 具體邏輯 
  14.   } 
  15. }; 

對于 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。

 

 

責任編輯:姜華 來源: 前端學苑
相關推薦

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺

2021-02-02 18:39:05

JavaScript

2020-11-10 10:48:10

JavaScript屬性對象

2019-01-09 10:04:16

2021-01-29 18:41:16

JavaScript函數語法

2021-06-04 09:56:01

JavaScript 前端switch

2023-05-08 08:21:15

JavaNIO編程

2021-03-05 18:04:15

JavaScript循環代碼

2021-09-27 09:18:30

ListIterato接口方法

2021-05-18 08:30:42

JavaScript 前端JavaScript時

2023-07-30 15:18:54

JavaScript屬性

2021-03-09 14:04:01

JavaScriptCookie數據

2024-04-19 14:23:52

SwitchJavaScript開發

2024-01-30 13:47:45

2021-01-26 23:46:32

JavaScript數據結構前端

2021-06-24 09:05:08

JavaScript日期前端

2021-02-26 20:01:57

SVG濾鏡元素

2023-09-06 14:57:46

JavaScript編程語言

2023-07-28 07:14:13

點贊
收藏

51CTO技術棧公眾號

美女日韩在线中文字幕| 日韩激情av| 9色精品在线| 国产精品美女免费视频| 在线视频1区| 美女尤物久久精品| 欧美成人午夜剧场免费观看| 国产一区二区观看| 2024国产精品| 少妇高潮毛片色欲ava片| 日韩中字在线| 日韩专区在线观看| 成人性生交大片免费看午夜| 奇米影视在线99精品| www.在线欧美| 国产精品久久久久久久久久小说 | 91丨porny丨蝌蚪视频| 欧美大片免费观看| 91久久久久久久久| 成人动漫视频在线观看| 在线亚洲+欧美+日本专区| 欧美午夜精品久久久久久蜜| 日韩av中文字幕一区| 欧美日韩国产小视频在线观看| 曰本色欧美视频在线| 色吊丝在线永久观看最新版本| 久久国产日本精品| 91久久精品美女高潮| 久久综合给合| 亚洲精品99久久久久中文字幕| 波多野结衣作品集| 久久99精品视频| 欧美日本精品在线| 欧美精品中文| 日韩在线激情视频| heyzo高清中文字幕在线| 天天综合天天做天天综合| 日韩国产一级片| 欧美视频网址| 国产一区二区三区在线播放免费观看| 国产电影一区| 国产区亚洲区欧美区| 一区二区三区四区电影| 亚洲影院色在线观看免费| 不卡在线一区二区| 国产精品福利网| 中文字幕av日韩精品| 欧美激情一区二区三区全黄| 4438x成人网全国最大| 91不卡在线观看| 亚洲综合第一页| 激情成人亚洲| 亚洲在线一区二区| 欧美黄色一级| 午夜精品久久久久久久无码| 欧美男人的天堂一二区| 丁香花在线电影小说观看| 久久久久久亚洲精品杨幂换脸| 国产精品永久入口久久久| 综合久久一区| 97久久精品午夜一区二区| 在线观看wwwxxxx| 中文字幕日韩欧美| 精品一区二区三区中文字幕在线 | 美女少妇精品视频| 亚洲图区在线| 国产欧美在线一区二区| 亚洲影院在线| 草草草视频在线观看| 同产精品九九九| 999精品网| 亚洲jizzjizz日本少妇| 奇米亚洲午夜久久精品| 无码人妻aⅴ一区二区三区日本| 欧美14一18处毛片| 亚洲人亚洲人成电影网站色| 成人福利影视| 亚洲欧美国产一区二区三区| 国产一级片黄色| 亚洲第一激情av| 午夜成在线www| 国产欧美精品日韩精品| av电影一区二区| 日韩二区三区| 在线视频一区二区| 欧美视频官网| 久久精品一区二| 亚洲一区二区三区毛片| 亚洲六月丁香色婷婷综合久久| 中文字幕乱码在线播放| 国产欧美日韩高清| 2欧美一区二区三区在线观看视频| 一二三四中文在线| 在线视频精品一| 久久免费看少妇高潮| 黄色免费在线看| 91在线色戒在线| 亚洲欧美另类图片小说| a成人v在线| 日韩av卡一卡二| av黄在线观看| 欧美一区二区三区日韩视频| 日韩在线激情| 久久久精品影院| 中文字幕免费不卡在线| 婷婷激情成人| 亚洲欧美丝袜| 亚洲成人手机在线| 可以免费看污视频的网站在线| 国产精品久久久久久久久 | 欧美一二三区| 日韩高清一区在线| 午夜影院在线播放| 日韩极品视频在线观看| 亚洲欧美制服综合另类| 性欧美长视频| 公共露出暴露狂另类av| 亚洲视频999| 国产老女人精品毛片久久| 成人小电影网站| 在线观看一区欧美| 999精品在线观看| 国产97在线观看| 欧美成人亚洲成人| 亚洲国内精品在线| 欧美人狂配大交3d怪物一区| 精品三级国产| 一区二区不卡在线观看| 日韩免费不卡av| 亚洲国产成人精品久久| 亚洲欧美电影一区二区| 日本麻豆一区二区三区视频| 无码日韩精品一区二区免费| 国产高清中文字幕在线| 超碰在线图片| 亚洲天堂av线| 欧美精品在欧美一区二区| 国产九色91| 91久久国产综合久久蜜月精品| 欧美国产日韩一区二区| 亚洲日本欧美日韩高观看| 在线观看免费高清视频97| 性久久久久久久久久久久| 国产精品久久久久久影院8一贰佰| 疯狂做受xxxⅹ高潮视频免费| 亚洲精品一区三区三区在线观看| 欧美综合激情| 日韩av中文在线| 欧美一级理论片| 国产精品福利一区二区| 精品一区二区在线看| 激情婷婷久久| 美女精品久久| 日本综合视频| 九色porny在线| 天堂v视频永久在线播放| 亚洲精品无码国产| 日韩成人在线资源| 欧美在线一二三区| 日本一区二区精品| 亚洲欧美国产va在线影院| 欧美一级理论性理论a| 精品日韩视频在线观看| 国产日韩欧美不卡| 92精品国产成人观看免费| 亚洲国产精品麻豆| 亚洲成av人影院在线观看网| 欧美成人a视频| 欧美高清一级片在线| 欧美精选一区二区| 欧美成人一区二区| 精品久久久久久无| 精品亚洲一区二区三区在线观看| 亚洲福利在线观看| 国产性色av一区二区| 亚洲精品视频播放| 欧美大奶子在线| 国产脚交av在线一区二区| 麻豆av一区| 日韩精品一区二区三区色偷偷 | swag国产精品一区二区| 久久人人99| 亚洲精品麻豆| 日韩av午夜在线观看| 粉嫩在线一区二区三区视频| 人人澡人人添人人爽一区二区| 污视频网站在线观看| 国内外成人免费在线视频| 吴梦梦av在线| 久久精品99国产| 国产911在线观看| 毛葺葺老太做受视频| 国产亚洲综合视频| 亚洲精品欧美一区二区三区| 精品少妇无遮挡毛片| 麻豆tv免费在线观看| 麻豆精品久久| 麻豆精品久久久| 狠狠躁天天躁日日躁欧美| 欧美日韩视频一区二区|