WKWebViewJSBridge
简介
在看过WebViewJavascriptBridge的项目后,我希望可以用 Swift 实现一个 JavaScript bridge,所以写了这个项目。该项目基于 WebViewJavascriptBridge
实现,仅支持 WKWebView
。
关于 WebViewJavascriptBridge
的实现,有兴趣的可以看一下我的笔记 WebViewJavascriptBridge 源码分析。
使用
原生端
1. 初始化
使用 WKWebView
初始化 bridge 对象
let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
bridge = WKWebViewJSBridge(webView: webView)
2. JavaScript调用原生
原生注册函数供JavaScript调用
bridge.register(handlerName: "nameFromNative") { [weak self] (data, callback) in
self?.data.append("[nameFormNative] called by JS, Data: \(data!)")
self?.data.append("Native responding Data!")
self?.tableView.reloadData()
callback?("Nero Native")
}
3. 原生调用JavaScript
原生调用JavaScript
bridge.call(handlerName: "JSBridgeBegin")
JavaScript端
1. 初始化
将以下代码复制到您的项目中
function setupWKWebViewJSBridge(callback) {
if (window.WKWebViewJSBridge) {
return callback(WKWebViewJSBridge);
}
if (window.WKWebViewJSBridgeCallbacks) {
return window.WKWebViewJSBridgeCallbacks.push(callback);
}
window.WKWebViewJSBridgeCallbacks = [callback];
window.webkit.messageHandlers.iOS_InjectJavascript.postMessage(null);
}
2. JavaScript注册函数或者调用原生函数
在调用setupWKWebViewJSBridge
函数后,使用bridge来注册Handlers和调用原生Handlers。
setupWKWebViewJSBridge(bridge => {
bridge.registerHandler('JSBridgeBegin', (data, responseCallback) => {
log('JSBridge Begin, Data', data, true);
});
bridge.registerHandler('nameFromJS', (data, responseCallback) => {
log('[nameFromJS] called by Native, Data', data, true);
log('JS responding Data!', 'Nero JS', true);
responseCallback('Nero JS');
});
});
要求
iOS 9.0+
。
安装
pod 'NNWKWebViewJSBridge'
作者
许可证
NNWKWebViewJSBridge 基于MIT许可证,查看LICENSE文件了解更多信息。