偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一篇文章了解 JsBridge

開發(fā)
近些年,移動端普及化越來越高,開發(fā)過程中選用 Native 還是 H5 一直是熱門話題。Native 和 H5 都有著各自的優(yōu)缺點(diǎn),為了滿足業(yè)務(wù)的需要,公司實(shí)際項(xiàng)目的開發(fā)過程中往往會融合兩者進(jìn)行 Hybrid 開發(fā)。Native 和 H5 分處兩地,看起來無法聯(lián)系,那么如何才能讓雙方協(xié)同實(shí)現(xiàn)功能呢?

                   [[345068]]

、jsbridge 定義

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


二、JSBridge 用途

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

雙向通信的通道:

1) JS 向 Native 發(fā)送消息: 調(diào)用相關(guān)功能、通知 Native 當(dāng)前 JS 的相關(guān)狀態(tài)等。

2) Native 向 JS 發(fā)送消息: 回溯調(diào)用結(jié)果、消息推送、通知 JS 當(dāng)前 Native 的狀態(tài)等。

H5與Native交互如下圖: 

三、JSBridge 的實(shí)現(xiàn)原理

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

 

在 JSBridge 的設(shè)計(jì)中,可以把前端看做 RPC 的客戶端,把 Native 端看做 RPC 的服務(wù)器端,從而 JSBridge 要實(shí)現(xiàn)的主要邏輯就出現(xiàn)了:通信調(diào)用(Native 與 JS 通信) 和句柄解析調(diào)用。


四、JSBridge 的通信原理

一、JavaScript 調(diào)用 Native的方式

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

1、注入API

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

對于 iOS 的 UIWebView,實(shí)例如下:

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

2、攔截 URL SCHEME

先解釋一下 URL SCHEME:URL SCHEME是一種類似于url的鏈接,是為了方便app直接互相調(diào)用設(shè)計(jì)的,形式和普通的 url 近似,主要區(qū)別是 protocol 和 host 一般是自定義的,

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


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

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

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

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

因此:JavaScript 調(diào)用 Native 推薦使用注入 API 的方式


二、Native 調(diào)用 JavaScript 的方式

相比于 JavaScript 調(diào)用 Native, Native 調(diào)用 JavaScript 較為簡單,直接執(zhí)行拼接好的 JavaScript 代碼即可。

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

對于 iOS 的 UIWebView,示例如下:

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

對于 iOS 的 WKWebView,示例如下:

  1. [wkWebView evaluateJavaScript:javaScriptString completionHandler:completionHandler]; 

三、通信原理總結(jié)

通信原理是 JSBridge 實(shí)現(xiàn)的核心

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

2)Native 調(diào)用 JavaScript 則直接執(zhí)行拼接好的 JavaScript 代碼即可。


四、JSBridge 接口實(shí)現(xiàn)

JSBridge 的接口主要功能有兩個:調(diào)用 Native(給 Native 發(fā)消息) 和 被 Native 調(diào)用(接收 Native 消息)。因此,JSBridge 可以設(shè)計(jì)如下:

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

在上面的文章中,提到過 RPC 中有一個非常重要的環(huán)節(jié)是 句柄解析調(diào)用 ,這點(diǎn)在 JSBridge 中體現(xiàn)為 句柄與功能對應(yīng)關(guān)系。同時,我們將句柄抽象為 橋名(BridgeName),最終演化為 一個 BridgeName 對應(yīng)一個 Native 功能或者一類 Native 消息?;诖它c(diǎn),JSBridge 的實(shí)現(xiàn)可以優(yōu)化為如下:

  1. window.JSBridge = { 
  2.   // 調(diào)用 Native 
  3.   invoke: function(bridgeName, data) { 
  4.   // 判斷環(huán)境,獲取不同的 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 ,其實(shí)就是 RPC 框架的回調(diào)機(jī)制。當(dāng)然也可以用更簡單的 JSONP 機(jī)制解釋:

當(dāng)發(fā)送 JSONP 請求時,url 參數(shù)里會有 callback 參數(shù),其值是 當(dāng)前頁面唯一 的,而同時以此參數(shù)值為 key 將回調(diào)函數(shù)存到 window 上,隨后,服務(wù)器返回 script 中,也會以此參數(shù)值作為句柄,調(diào)用相應(yīng)的回調(diào)函數(shù)。

整體流程:

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

Native調(diào)用 JavaScript 也同樣簡單,直接自動生成一個唯一的 ResponseId,并存儲句柄,然后和 data 一起發(fā)送給前端即可。

 

五、JSBridge 如何引用

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

 

1) 由 Native 端進(jìn)行注入

注入方式和 Native 調(diào)用 JavaScript 類似,直接執(zhí)行橋的全部代碼。

優(yōu)點(diǎn):橋的版本很容易與 Native 保持一致,Native 端不用對不同版本的 JSBridge 進(jìn)行兼容;與此同時,

缺點(diǎn):注入時機(jī)不確定,需要實(shí)現(xiàn)注入失敗后重試的機(jī)制,保證注入的成功率,同時 JavaScript 端在調(diào)用接口時,需要優(yōu)先判斷 JSBridge 是否已經(jīng)注入成功。


2) 由 JavaScript 端引用

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

優(yōu)點(diǎn):JavaScript 端可以確定 JSBridge 的存在,直接調(diào)用即可;

缺點(diǎn):如果橋的實(shí)現(xiàn)方式有更改,JSBridge 需要兼容多版本的 Native Bridge 或者 Native Bridge 兼容多版本的 JSBridge。

 

 

責(zé)任編輯:姜華 來源: 前端學(xué)苑
相關(guān)推薦

2021-06-30 00:20:12

Hangfire.NET平臺

2023-05-12 08:19:12

Netty程序框架

2023-05-08 08:21:15

JavaNIO編程

2023-07-28 07:14:13

2024-04-19 14:23:52

SwitchJavaScript開發(fā)

2023-09-06 14:57:46

JavaScript編程語言

2023-07-30 15:18:54

JavaScript屬性

2021-05-18 08:30:42

JavaScript 前端JavaScript時

2024-01-30 13:47:45

2021-03-05 18:04:15

JavaScript循環(huán)代碼

2021-03-09 14:04:01

JavaScriptCookie數(shù)據(jù)

2021-09-27 09:18:30

ListIterato接口方法

2021-01-26 23:46:32

JavaScript數(shù)據(jù)結(jié)構(gòu)前端

2021-06-24 09:05:08

JavaScript日期前端

2020-12-08 08:09:49

SVG圖標(biāo)Web

2021-02-26 20:01:57

SVG濾鏡元素

2019-01-09 10:04:16

2021-01-29 18:41:16

JavaScript函數(shù)語法

2021-06-04 09:56:01

JavaScript 前端switch

2021-02-02 18:39:05

JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號