如何解决SwiftUI:在 macOS 上与 WKWebView 的 Javascript 通信
我希望 javascript 将消息发送回我的 WKWebView 对象,但我没有收到任何响应。我知道脚本正在运行,因为颜色会发生变化,但我希望还能在控制台中看到“来自 JS 的触发器”,而我没有。如果我在 Chrome 中运行 html,javascript 控制台会显示“无法读取未定义的属性‘messageHandlers’”。如果我为 iOS 构建(使用 UIViewRepresentable、MakeUIView 和 UpdateUIView),结果是一样的。如果有人能发现我错过了什么,我将不胜感激。
这是完整的代码:
import SwiftUI
import WebKit
class HtmlData {
let html = """
<!DOCTYPE html>
<html>
<body>
<button onclick="sendMessage()">Send Message</button>
<script>
function sendMessage() {
document.body.style.backgroundColor = "red";
window.webkit.messageHandlers.testMessage.postMessage("trigger from JS");
}
</script>
</body>
</html>
"""
}
struct ContentView: View {
let htmlData = HtmlData()
var body: some View {
JSWebView(html: htmlData.html)
}
}
struct JSWebView: NSViewRepresentable {
let html: String
func makeNSView(context: Context) -> WKWebView {
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
return WKWebView()
}
func updateNSView(_ view: WKWebView,context: Context) {
let userContentController = WKUserContentController()
let handler = ContentController(view)
let configuration = WKWebViewConfiguration()
configuration.userContentController = userContentController
configuration.userContentController.add(handler,name: "testMessage")
view.loadHTMLString(html,baseURL: Bundle.main.bundleURL)
}
class ContentController: NSObject,WKScriptMessageHandler {
var parent: WKWebView?
init(_ parent: WKWebView?) {
self.parent = parent
}
func userContentController(_ userContentController: WKUserContentController,didReceive message: WKScriptMessage) {
print(message.body)
}
}
}
解决方法
必须将配置传递到 WKWebView 的构造函数中。初始化后不能设置。
struct JSWebView: NSViewRepresentable {
let html: String
func makeNSView(context: Context) -> WKWebView {
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let handler = MessageHandler()
let configuration = WKWebViewConfiguration()
configuration.userContentController.add(handler,name: "testMessage")
return WKWebView(frame: .zero,configuration: configuration)
}
func updateNSView(_ view: WKWebView,context: Context) {
view.loadHTMLString(html,baseURL: Bundle.main.bundleURL)
}
class MessageHandler: NSObject,WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController,didReceive message: WKScriptMessage) {
print(message.body)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。