在看了WebViewJavascriptBridge的项目,我希望可以用swift去实现一个JavaScript bridge,所以写了这个项目。该项目是基于WebViewJavascriptBridge
实现,仅支持WKWebView
。
关于WebViewJavascriptBridge
的实现,有兴趣的可以看一下我的笔记WebViewJavascriptBridge源码分析。
使用WKWebView
初始化bridge对象
let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
bridge = WKWebViewJSBridge(webView: webView)
Native注册函数给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")
}
Native调用JavaScript
bridge.call(handlerName: "JSBridgeBegin")
复制以下代码到你的项目中
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);
}
调用setupWKWebViewJSBridge
函数后用bridge来注册Handlers以及调用Native 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 文件了解更多信息。