XHQWebViewJavascriptBridge 0.1.0

XHQWebViewJavascriptBridge 0.1.0

xuhaiqing 维护。



  • xuhaiqing

XHQWebViewJavascriptBridge

Version License Platform

一个 iOS/macOS 桥接器,用于在 UIWebViews、WebViews、WKWebViews 之间发送 Swift 和 JavaScript 之间的消息。根据 Obj-C 和 JavaScript,修复了一些错误。

安装 (iOS & macOS)

使用 CocoaPods 安装

将以下内容添加到您的 Podfile 并运行 pod install 进行安装

pod 'XHQWebViewJavascriptBridge'

手动安装

WebViewJavascriptBridge 文件夹拖入您的项目。

在出现的对话框中,取消选中 "将项复制到目标组的文件夹中" 并选择 "为任何文件夹创建组"。

示例

请查看 Example/ 文件夹。打开 iOS 或 macOS 项目并运行,以查看其功能。

在您的项目中使用 WebViewJavascriptBridge

用法

  1. 使用 UIWebView (iOS) 或 WebView (OSX) 实例化 WebViewJavascriptBridge,或者使用 WKWebView 实例化 WKWebViewJavascriptBridge
bridge = WebViewJavascriptBridge.bridge(forWebView: webView!) 
or
bridge = WKWebViewJavascriptBridge.bridge(forWebView: webView!) 
  1. 在 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))")
})
  1. 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)
}
  1. 最后,调用 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 文件。