XHQWebViewJavascriptBridge
一个 iOS/macOS 桥接器,用于在 UIWebViews、WebViews、WKWebViews 之间发送 Swift 和 JavaScript 之间的消息。根据 Obj-C 和 JavaScript,修复了一些错误。
安装 (iOS & macOS)
使用 CocoaPods 安装
将以下内容添加到您的 Podfile 并运行 pod install
进行安装
pod 'XHQWebViewJavascriptBridge'
手动安装
将 WebViewJavascriptBridge
文件夹拖入您的项目。
在出现的对话框中,取消选中 "将项复制到目标组的文件夹中" 并选择 "为任何文件夹创建组"。
示例
请查看 Example/
文件夹。打开 iOS 或 macOS 项目并运行,以查看其功能。
在您的项目中使用 WebViewJavascriptBridge
用法
- 使用 UIWebView (iOS) 或 WebView (OSX) 实例化 WebViewJavascriptBridge,或者使用 WKWebView 实例化 WKWebViewJavascriptBridge
bridge = WebViewJavascriptBridge.bridge(forWebView: webView!)
or
bridge = WKWebViewJavascriptBridge.bridge(forWebView: webView!)
- 在 Swift 中注册处理程序,并调用 JS 处理程序
bridge?.registerHandler(handlerName: "Swift Echo", handler: { (data, responseCallback) in
print("Swift Echo called with: \(String(describing: data))")
responseCallback(data)
})
bridge?.callHandler(handlerName: "JS Echo", data: nil, responseCallback: { (data) in
print("Swift received response\(String(describing: data))")
})
- 将
setupWebViewJavascriptBridge
拷贝并粘贴到您的 JS 中
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
- 最后,调用
setupWebViewJavascriptBridge
,然后使用该桥接器注册处理程序并调用 Swift 处理程序
setupWebViewJavascriptBridge(function(bridge) {
/* Initialize your app here */
bridge.registerHandler('JS Echo', function(data, responseCallback) {
console.log("JS Echo called with:", data)
responseCallback(data)
})
bridge.callHandler('Swift Echo', {'key':'value'}, function responseCallback(responseData) {
console.log("JS received response:", responseData)
})
})
API 参考
Swift API
WebViewJavascriptBridge.bridge(forWebView: webView:UIWebView/WebView) 或 WKWebViewJavascriptBridge.bridge(forWebView: webView:WKWebView)
为给定的 WebView 创建一个 JavaScript 桥接器。
示例
WebViewJavascriptBridge.bridge(forWebView: webView!)
WKWebViewJavascriptBridge.bridge(forWebView: webView!)
bridge.registerHandler(handlerName:String,handler:@escaping WVJBHandler)
注册一个名为 handlerName
的处理程序。JavaScript 可以使用 WebViewJavascriptBridge.callHandler("handlerName")
来调用此处理程序。
示例
bridge?.registerHandler(handlerName: "getScreenHeight", handler: { (data, responseCallback) in
print("ObjC Echo called with: \(String(describing: data))")
responseCallback(UIScreen.main.bounds.size.height)
})
bridge?.registerHandler(handlerName: "log", handler: { (data, responseCallback) in
print("Log \(String(describing: data))")
})
bridge.callHandler(handlerName:String?)
bridge.callHandler(handlerName:String?, data:Any?)
bridge.callHandler(handlerName:String?, data:Any?,responseCallback:WVJBResponseCallback?)
调用名为 handlerName
的 JavaScript 处理器。如果提供了一个 responseCallback
闭包,JavaScript 处理器可以响应。
示例
bridge?.callHandler(handlerName: "testJavascriptHandler", data: ["foo":"before ready"])
bridge.webViewDelegate
可选的,如果你需要响应 web view 的生命周期事件,设置一个 WKNavigationDelegate/UIWebViewDelegate
。
bridge disablesJavscriptAlertBoxSafetyTimeout()
非常不安全。通过禁用 setTimeout 安全检查来加速桥接消息传递。只有在没有调用任何 JavaScript 弹出框函数(alert、confirm 和 prompt)的情况下才安全禁用此安全检查。如果在桥接 JavaScript 代码中调用这些函数之一,应用将挂起。
示例
bridge.disableJavscriptAlertBoxSafetyTimeout();
JavaScript API
bridge.registerHandler("handlerName", function(responseData) { ... })
注册一个名为 handlerName
的处理程序。Swift 可以通过 [bridge callHandler:"handlerName" data:@"Foo"]
和 [bridge callHandler:"handlerName" data:@"Foo" responseCallback:^(id responseData) { ... }]
调用此处理程序。
示例
bridge.registerHandler("showAlert", function(data) { alert(data) })
bridge.registerHandler("getCurrentPageUrl", function(data, responseCallback) {
responseCallback(document.location.toString())
})
bridge.callHandler("handlerName", data)
bridge.callHandler("handlerName", data, function responseCallback(responseData) { ... })
调用名为 handlerName
的 Swift 处理程序。如果提供了 responseCallback
函数,Swift 处理程序可以响应。
示例
bridge.callHandler("Log", "Foo")
bridge.callHandler("getScreenHeight", null, function(response) {
alert('Screen height:' + response)
})
bridge.disableJavscriptAlertBoxSafetyTimeout()
调用 bridge.disableJavscriptAlertBoxSafetyTimeout()
的效果与在 Swift 中调用 bridge.disableJavscriptAlertBoxSafetyTimeout()
相同。
示例
bridge.disableJavscriptAlertBoxSafetyTimeout()
作者
xuhaiqing, [email protected]
许可证
XHQWebViewJavascriptBridge 是在 MIT 许可证下可用的。有关更多信息,请参阅 LICENSE 文件。