【发布时间】:2021-03-27 18:54:46
【问题描述】:
我想在 SwiftUI 中使用带有 JavaScript 处理的 WKWebView。从Swift Variables Initialization,我正在执行以下操作:(我正在使用https://github.com/kylehickinson/SwiftUI-WebView 为SwiftUI 中的WKWebView 提供一个包装器,它还添加了有价值的布局约束。)
struct ContentView: View {
var body: some View {
WebView(webView: myWebView)
.onAppear {
let url = Bundle.main.url(forResource: "index", withExtension: "html")!
myWebView.loadFileURL(url, allowingReadAccessTo: url)
let request = URLRequest(url: url)
myWebView.load(request)
}
}
class JSHandler : NSObject, WKScriptMessageHandler {
var contentView: ContentView?
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print("documentReady")
contentView!.myWebView.evaluateJavaScript("<Long Script to Transfer Data>") { (result, error) in
}
}
}
let myJSHandler = JSHandler()
var myWebView: WKWebView = {
let config = WKWebViewConfiguration()
let controller = WKUserContentController()
controller.add(myJSHandler , name: "documentReady")
config.userContentController = controller
return WKWebView(frame: .zero, configuration: config)
}()
}
但后来我从Instance member cannot be used on type 得知这不起作用,因为闭包没有对 self 的引用。我需要 WKWebView 有专用的配置对象,所以我不能只使用其他构造函数。我需要参考它来做evaluateJavaScript。
如何做到这一点?
编辑 1:添加 body 并提及用于包装 WKWebView 的框架。
编辑 2:添加了代码以阐明我需要通过 WKScriptMessageHandler 从 WKWebView 到本机应用程序的两种方式通信(以便在 HTML 文档准备好时得到通知)和从本机应用程序到WKWebView via evaluateJavaScript(在 HTML 文档准备好时传输数据)。
【问题讨论】:
-
将
WKWebView包装到 UIViewRepresentable 中,就像在 stackoverflow.com/a/59790493/12299030 中一样。 -
@Asperi 在 struct WebView 中,您使用的是
var webview: WKWebView = WKWebView(),但我需要使用带有自定义配置的构造函数。那我不会遇到同样的问题吗? (我已经使用github.com/kylehickinson/SwiftUI-WebView 将 WKWebView 包装到 UIViewRepresentable 中。) -
这里是备用stackoverflow.com/a/60173992/12299030。你可以使用任何适合你的。
-
@Asperi 感谢您的解决方案。我想指出,由于配置是在包装器内完成的,所以如果我想用一组不同的 JS 方法制作另一个 WKWebView,我将不得不制作另一个包装器!另一个问题是我需要在我的
ContentView中引用WKWebView,以便我可以调用evaluateJavaScript!