参考 WKWebViewJavascriptBridge 实现的 Android 平台 Js 桥接库,尽可能保持了和 WKWebViewJavascriptBridge 相同的 api,支持自定义桥接名称,并且没有与 WebView 强行耦合,更像是对 WebView 能力的增强。
repositories {
mavenCentral()
}
implementation("io.github.rdsunhy:component-jsbridge:1.0.0")
val bridgeHandler: IBridgeHandler = JsBridgeHandler()
bridgeHandler.attach(webView)
// 当 view 销毁时调用
bridgeHandler.detach()
// 支持自定义桥接名称
WebJsBridge.setBridgeName("YourCustomName") // 默认: WKWebViewJavascriptBridge
// 原生层注册方法供 js 调用
bridgeHandler.registerBridger("NativeBridgeMethodName") { data, callback ->
// todo
}
// 原生层调用 js 提供的方法
bridgeHandler.callBridger("JsBridgeMethodName", data) { response ->
// todo
}
function setupWebViewJsBridge(callback) {
let isAndroid = Boolean(navigator.userAgent.match(/android/ig));
let isIOS = Boolean(navigator.userAgent.match(/iphone|ipod|iOS/ig));
if (window.WKWebViewJavascriptBridge) {
return callback(window.WKWebViewJavascriptBridge);
}
if (window.WKWVJBCallbacks) {
window.WKWVJBCallbacks.push(callback);
} else {
window.WKWVJBCallbacks = [callback];
}
if (isAndroid) { // 对比 ios 平台的 WKWebViewJavascriptBridge 库这里需要区分一下 Android 平台
if (!window.InjectJavascript) {
window.alert("ERROR: window.InjectJavascript if null!");
return;
}
window.InjectJavascript.init();
} else if (isIOS) {
window.webkit.messageHandlers.iOS_Native_InjectJavascript.postMessage(null);
}
}
// js 层注册桥接方法
setupWebViewJsBridge(function(bridge) {
bridge.registerHandler("JsBridgeMethodName", function(data, callback) {
// todo
let response = {
"msg": "invoke success"
}
callback(response) // 支持回调
})
})
// js 层调用原生提供的方法
setupWebViewJsBridge(function(bridge) {
bridge.callHandler("NativeBridgeMethodName", params, function(data) {
// todo
let response = JSON.parse(data)
})
})