# JS Bridge 总结
JS Bridge 是构建 Native 和非 Native 间 双向通信的通道
,本文主要介绍 JS Bridge 的通信策略。
- Js -> Native
- Native -> Js
# Js -> Native
JavaScript 调用 Native 的方式,主要有两种:注入 API 和 拦截 URL SCHEME。
# 注入 API
注入 API 方式的主要原理是,通过 WebView 提供的接口,向 JavaScript 的 Context(window)中注入对象或者方法,让 JavaScript 调用时,直接执行相应的 Native 代码逻辑,达到 JavaScript 调用 Native 的目的。
使用 Native 方式注入后,直接调用:
window.nativeAPI.xxx(message);
1
# 拦截 URL SCHEME
拦截 URL SCHEME 的主要流程是:Web 端通过某种方式(例如 iframe.src)发送 URL Scheme 请求,之后 Native 拦截到请求并根据 URL SCHEME(包括所带的参数)进行相关操作。
优缺点:
- 兼容性好。
- 使用 iframe.src 发送 URL SCHEME 会有 url 长度的隐患。
# Native -> Js
Native 调用 JS 比较简单,只要 H5 端将 JS 方法暴露在 Window 上给 Native 调用即可。
# 简单实现
(function() {
var id = 0;
var callbacks = {};
window.JSBridge = {
// 调用 Native
invoke: function(bridgeName, callback, data) {
// 判断环境,获取不同的 nativeBridge
var thisId = id++; // 获取唯一 id
callbacks[thisId] = callback; // 存储 Callback
nativeAPI.postMessage({
bridgeName: bridgeName,
data: data || {},
callbackId: thisId // 传到 Native 端
});
},
receiveMessage: function(msg) {
var bridgeName = msg.bridgeName,
data = msg.data || {},
callbackId = msg.callbackId; // Native 将 callbackId 原封不动传回
if (callbackId) {
if (callbacks[callbackId]) {
// 找到相应句柄
callbacks[callbackId](msg.data); // 执行调用
}
}
}
};
})();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30