WebViewJSBridge
@MainActor
public class WebViewJSBridge : NSObject, WKScriptMessageHandler
WKWebView实现Javascript桥接器
参考链接: WKWebViewJavascriptBridge
Javascript示例: (兼容FWFramework/[WK]WebViewJavascriptBridge)
function setupWebViewJavascriptBridge(callback) {
if (window.webkit &&
window.webkit.messageHandlers &&
window.webkit.messageHandlers.iOS_Native_InjectJavascript) {
if (window.WKWebViewJavascriptBridge) { return callback(WKWebViewJavascriptBridge); }
if (window.WKWVJBCallbacks) { return window.WKWVJBCallbacks.push(callback); }
window.WKWVJBCallbacks = [callback];
window.webkit.messageHandlers.iOS_Native_InjectJavascript.postMessage(null);
return;
}
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(function(bridge) {
bridge.registerHandler('jsHandler', function(data, responseCallback) {
var responseData = {'key': 'value'}
responseCallback(responseData)
})
bridge.callHandler('iosHandler', {'key': 'value'}, function(response) {
console.log(response)
})
})
-
JS桥接上下文
See moreDeclaration
Swift
public class Context : NSObject, @unchecked Sendable -
JS桥接WKScriptMessageHandler弱引用代理类,解决delegate无法释放问题
See moreDeclaration
Swift
@MainActor public class WeakProxy : NSObject, WKScriptMessageHandler -
JS桥接处理句柄
Declaration
Swift
public typealias Handler = @MainActor @Sendable (Context) -> Void -
JS桥接完成回调
Declaration
Swift
public typealias Completion = @MainActor @Sendable (Any?) -> Void -
JS桥接消息对象
Declaration
Swift
public typealias Message = [String : Any] -
是否启用日志,默认false
Declaration
Swift
@MainActor public var isLogEnabled: Bool -
Undocumented
Declaration
Swift
@MainActor public init(webView: WKWebView)
-
注册JS桥接处理类或对象
Declaration
Swift
@MainActor public func registerClass(_ clazz: Any, package: String? = nil, context object: AnyObject? = nil, mapper: (([String]) -> [String : String])? = nil)Parameters
clazzJS桥接处理类或对象
package桥接包名,默认nil。示例:app.
object自定义上下文,可通过context.object访问,示例:WebView控制器
mapper自定义映射,默认nil时查找规则:xxxBridge: > xxxDefaultBridge:
-
取消注册指定JS桥接处理类或对象
Declaration
Swift
@MainActor public func unregisterClass(_ clazz: Any, package: String? = nil, mapper: (([String]) -> [String : String])? = nil)Parameters
clazzJS桥接处理类或对象
package桥接包名,默认nil。示例:app.
mapper自定义映射,默认nil时查找规则:xxxBridge: > xxxDefaultBridge:
-
注册指定名称处理句柄
Declaration
Swift
@MainActor public func registerHandler(_ handlerName: String, handler: @escaping Handler) -
移除指定名称处理句柄
Declaration
Swift
@MainActor public func removeHandler(_ handlerName: String) -
获取所有已注册处理句柄的名称
Declaration
Swift
@MainActor public func getRegisteredHandlers() -> [String] -
设置错误处理句柄,句柄未找到时触发
Declaration
Swift
@MainActor public func setErrorHandler(_ handler: Handler?) -
注册过滤器句柄,句柄访问时优先触发。如果返回true,继续处理handler,否则停止处理
Declaration
Swift
@MainActor public func setFilterHandler(_ handler: (@MainActor @Sendable (Context) -> Bool)?) -
调用JS端已注册的句柄,完成后回调
Declaration
Swift
@MainActor public func callHandler(_ handlerName: String, data: Any? = nil, callback: Completion? = nil) -
重置JS桥接队列
Declaration
Swift
@MainActor public func reset()
-
Undocumented
Declaration
Swift
@MainActor public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
View on GitHub