我想在SwiftUI中使用WKWebView进行JavaScript处理。在Swift变量初始化中,我正在执行以下操作:(我正在使用https://github.com/kylehickinson/SwiftUI-WebView为WKWebView
SwiftUI提供包装,这也增加了宝贵的布局约束。)
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)
}()
}
但是后来我从实例成员那里得知,不能在类型上使用它,因为闭包没有引用self。我需要WKWebView具有专用的配置对象,所以我不能只使用其他构造函数。我需要对此做一个参考evaluateJavaScript
。
如何使这项工作?
编辑1:添加body
并提及用于包装WKWebView的框架。
编辑2:添加了代码以阐明我需要两种通信方式,从WKWebView
到本机应用程序通过WKScriptMessageHandler
(通过HTML文档准备就绪时得到通知)和从本机应用程序到WKWebView
via evaluateJavaScript
(在HTML文档准备就绪时传输数据)进行通信。
一种可能的解决方案是在以下位置配置WKWebView init
struct ContentView: View {
private var myWebView: WKWebView
init() {
let config = WKWebViewConfiguration()
let controller = WKUserContentController()
controller.add(myJSHandler , name: "documentReady")
config.userContentController = controller
myWebView = WKWebView(frame: .zero, configuration: config)
}
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 {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print("documentReady")
message.webView?.evaluateJavaScript("<Long Script to Transfer Data>") { (result, error) in
}
}
}
let myJSHandler = JSHandler()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句