jsbridge、postMessage、scheme三種通信方式的區(qū)別以及安卓ios的實(shí)現(xiàn)方式
在混合開發(fā)(Hybrid App)中,Web 與 Native(Android/iOS)之間的通信是核心需求。常見的三種通信方式是:
- JSBridge(基于 addJavascriptInterface / WKScriptMessageHandler)
- postMessage + MessageChannel(現(xiàn)代 WebView 通信)
- URL Scheme(攔截自定義協(xié)議)
下面從 原理、區(qū)別、安全性、平臺(tái)實(shí)現(xiàn) 等維度詳細(xì)對(duì)比,并給出 Android 和 iOS 的實(shí)現(xiàn)方式。
一、三種方式概覽對(duì)比
| 特性 | JSBridge | postMessage(MessageChannel) | URL Scheme |
|---|---|---|---|
| 通信方向 | 雙向(JS → Native,Native → JS) | 雙向(更標(biāo)準(zhǔn)) | 主要 JS → Native |
| 實(shí)時(shí)性 | 高 | 高(異步消息通道) | 中(依賴頁面跳轉(zhuǎn)/iframe) |
| 安全性 | 中(需謹(jǐn)慎暴露接口) | 高(沙箱隔離) | 低(易被中間人劫持) |
| 兼容性 | Android ≥ API 17;iOS ≥ WKWebView | Android ≥ 6.0(API 23);iOS ≥ WKWebView | 全平臺(tái)支持 |
| 實(shí)現(xiàn)復(fù)雜度 | 中 | 中高 | 低 |
| 是否推薦 | ? 常用(但注意安全) | ?? 推薦(現(xiàn)代方案) | ?? 僅用于簡單場(chǎng)景 |
二、詳細(xì)說明與實(shí)現(xiàn)
1. JSBridge(傳統(tǒng)橋接)
原理:
- Android:通過
WebView.addJavascriptInterface()注入 Java 對(duì)象。 - iOS:通過
WKWebView.configuration.userContentController.add(_:name:)注冊(cè)消息處理器。
安全要求:
- Android 必須加
@JavascriptInterface - iOS 需驗(yàn)證來源(如域名白名單)
Android 實(shí)現(xiàn):
java
編輯
1// Java
2public class Bridge {
3 @JavascriptInterface
4 public void callNative(String data) {
5 // 處理 JS 調(diào)用
6 }
7}
8webView.addJavascriptInterface(new Bridge(), "Android");
javascript
編輯
1// JS
2Android.callNative("hello");
iOS 實(shí)現(xiàn)(Swift):
swift
編輯
1// Swift
2class BridgeHandler: NSObject, WKScriptMessageHandler {
3 func userContentController(_ controller: WKUserContentController, didReceive message: WKScriptMessage) {
4 if message.name == "iosBridge" {
5 print("收到 JS 消息:", message.body)
6 }
7 }
8}
9
10let config = WKWebViewConfiguration()
11config.userContentController.add(BridgeHandler(), name: "iosBridge")
12let webView = WKWebView(frame: .zero, configuration: config)
javascript
編輯
1// JS
2window.webkit.messageHandlers.iosBridge.postMessage("hello");
? 優(yōu)點(diǎn):簡單直接,廣泛使用
? 缺點(diǎn):Android 舊版本有安全漏洞;iOS 無法直接返回值(需回調(diào))
2.postMessage+MessageChannel(現(xiàn)代通信)
原理:
利用 HTML5 的 MessageChannel 創(chuàng)建一個(gè)雙向、異步、隔離的消息通道,Native 作為另一端接收端口。
這是 Chrome 團(tuán)隊(duì)推薦的 WebView 通信方式,安全性高。
Android 實(shí)現(xiàn)(API ≥ 23):
java
編輯
1webView.evaluateJavascript("(function() {" +
2 "const channel = new MessageChannel();" +
3 "channel.port1.onmessage = function(e) { console.log('Reply:', e.data); };" +
4 "window.nativePort = channel.port2;" +
5 "})()", null);
6
7// Native 發(fā)送消息到 JS
8webView.postWebMessage(
9 new WebMessageCompat("Hello from Android", new WebMessagePortCompat[]{port}),
10 Uri.parse("https://your-trusted-domain.com")
11);
注意:需配合
WebMessageListener(AndroidX)或postWebMessage使用。
iOS 實(shí)現(xiàn)(WKWebView):
iOS 的 WKScriptMessageHandler 本身不直接支持 MessageChannel,但可通過 JS 端模擬雙向通信,或使用 evaluateJavaScript 返回結(jié)果。
目前 Android 對(duì) MessageChannel 原生支持更好,iOS 仍以
messageHandlers為主。
? 優(yōu)點(diǎn):安全、標(biāo)準(zhǔn)、支持流式通信
? 缺點(diǎn):兼容性較差(Android < 6.0 不支持)
3. URL Scheme(攔截跳轉(zhuǎn))
原理:
JS 通過 location.href = "myapp://action?param=xxx" 觸發(fā)頁面跳轉(zhuǎn),Native 攔截該 URL 并解析。
Android 實(shí)現(xiàn):
java
編輯
1webView.setWebViewClient(new WebViewClient() {
2 @Override
3 public boolean shouldOverrideUrlLoading(WebView view, String url) {
4 if (url.startsWith("myapp://")) {
5 // 解析參數(shù)并處理
6 return true; // 攔截,不加載
7 }
8 return false;
9 }
10});
iOS 實(shí)現(xiàn):
swift
編輯
1func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
2 if let url = navigationAction.request.url,
3 url.scheme == "myapp" {
4 // 處理自定義協(xié)議
5 decisionHandler(.cancel) // 攔截
6 return
7 }
8 decisionHandler(.allow)
9}
技巧:避免頁面跳轉(zhuǎn)閃爍
使用隱藏的
<iframe>觸發(fā):javascript 編輯 1const iframe = document.createElement('iframe'); 2iframe.src = 'myapp://call?data=xxx'; 3iframe.style.display = 'none'; 4document.body.appendChild(iframe); 5setTimeout(() => document.body.removeChild(iframe), 100);
? 優(yōu)點(diǎn):兼容性極好(所有 WebView 支持)
? 缺點(diǎn):
- 無法直接返回值(需 JS 再調(diào)一次)
- URL 長度有限(~2000 字符)
- 安全性差(可能被第三方頁面?zhèn)卧煺{(diào)用)
三、如何選擇?
| 場(chǎng)景 | 推薦方案 |
|---|---|
| 現(xiàn)代 App(Android ≥ 6.0,iOS ≥ 9) | ? JSBridge + 安全校驗(yàn) 或 postMessage(Android 優(yōu)先) |
| 需要高安全性(如金融類) | ? postMessage + 域名白名單 + HTTPS |
| 兼容老舊設(shè)備 | ?? URL Scheme(但需加密參數(shù)、校驗(yàn)來源) |
| 頻繁雙向通信(如聊天、實(shí)時(shí)數(shù)據(jù)) | ? JSBridge + 回調(diào)機(jī)制 或 MessageChannel |
| 僅簡單通知(如分享、埋點(diǎn)) | ? URL Scheme 足夠 |
四、最佳實(shí)踐建議
- 永遠(yuǎn)啟用 HTTPS,防止中間人注入惡意 JS。
- 驗(yàn)證 WebView 加載的域名(白名單),避免第三方頁面調(diào)用你的 Native 接口。
- 不要在 JSBridge 中暴露敏感操作(如讀取文件、獲取 token)。
- 對(duì) URL Scheme 參數(shù)做簽名或加密,防止偽造。
- 優(yōu)先使用 WKWebView(iOS)和 AndroidX WebView(Android) ,避免使用過時(shí)的
UIWebView或系統(tǒng) WebView。
到此這篇關(guān)于jsbridge、postMessage、scheme三種通信方式的區(qū)別以及安卓ios實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)jsbridge、postMessage、scheme通信方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
View觸發(fā)機(jī)制API實(shí)現(xiàn)GestureDetector OverScroller詳解
這篇文章主要為大家介紹了View觸發(fā)機(jī)制API實(shí)現(xiàn)GestureDetector OverScroller詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android使用Rotate3dAnimation實(shí)現(xiàn)3D旋轉(zhuǎn)動(dòng)畫效果的實(shí)例代碼
利用Android的ApiDemos的Rotate3dAnimation實(shí)現(xiàn)了個(gè)圖片3D旋轉(zhuǎn)的動(dòng)畫,圍繞Y軸進(jìn)行旋轉(zhuǎn),還可以實(shí)現(xiàn)Z軸的縮放。點(diǎn)擊開始按鈕開始旋轉(zhuǎn),點(diǎn)擊結(jié)束按鈕停止旋轉(zhuǎn)。2018-05-05
android中DownloadManager實(shí)現(xiàn)版本更新,監(jiān)聽下載進(jìn)度實(shí)例
本篇文章主要介紹了android中DownloadManager實(shí)現(xiàn)版本更新,監(jiān)聽下載進(jìn)度實(shí)例。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
導(dǎo)入takephoto庫編譯失敗與glide庫沖突應(yīng)排除依賴
今天小編就為大家分享一篇關(guān)于導(dǎo)入takephoto庫編譯失敗與glide庫沖突應(yīng)排除依賴的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
RecyclerView優(yōu)雅實(shí)現(xiàn)復(fù)雜列表布局
這篇文章主要為大家詳細(xì)介紹了RecyclerView優(yōu)雅實(shí)現(xiàn)復(fù)雜列表布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
android微信授權(quán)獲取用戶個(gè)人信息代碼
大家好,本篇文章主要講的是android微信授權(quán)獲取用戶個(gè)人信息代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12

