为何deleteAccount事件无法触发WKScriptMessageHandler的didReceive方法?
问题原因及解决方案
核心问题:Coordinator中错误使用@Environment属性包装器
你的Coordinator类是继承自NSObject的非SwiftUI视图类,不能直接使用@Environment(\.colorScheme)属性包装器。这种错误用法会导致Coordinator实例初始化异常,进而无法正常接收WKScriptMessage回调。
修复步骤
移除Coordinator中的@Environment声明,如果需要获取配色方案,可通过
makeCoordinator的context传递环境变量:func makeCoordinator() -> Coordinator { Coordinator(self, colorScheme: context.environment.colorScheme) } class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler { private let colorScheme: ColorScheme private var parent: ContentWebView private var webViewNavigationSubscriber: AnyCancellable? = nil init(_ webView: ContentWebView, colorScheme: ColorScheme) { self.parent = webView self.colorScheme = colorScheme super.init() } // 其余代码保持不变 }清理多余的消息处理器注册:
代码中注册的deleteAccount?属于多余的消息名称,建议移除避免混淆:// 移除该行 // contentController.add(context.coordinator, name: "deleteAccount?") contentController.add(context.coordinator, name: "deleteAccount")验证JavaScript调用有效性:
在JS中添加日志,确认handleDelete函数及消息发送逻辑正常执行:const handleDelete = () => { console.log("Delete button triggered"); if (window?.android) { window?.android?.clickedOnDeleteAccountBtn(); } else { if (window?.webkit?.messageHandlers?.deleteAccount) { console.log("Sending message to iOS"); window.webkit.messageHandlers.deleteAccount.postMessage(null); } else { console.log("deleteAccount handler not detected"); } }; };
额外检查点
- 确认WebView加载页面的域名符合App的ATS设置,未被阻止执行JavaScript。
- 确保
WKWebView实例在SwiftUI视图层级中被正确保留,未被意外释放。
内容的提问来源于stack exchange,提问作者razvan
相关产品推荐
相关产品推荐

