Evaluatejavascript In Swiftui
How to get evaluateJavaScript to work when a message is received from webview? print(message.body) <--- this is working parent?.evaluateJavaScript('document.getElementsByClass
Solution 1:
Here is possible approach. As I don't have intended testing environment I could not test it completely, but all infrastructure constructed correctly. So you can try
structWebView: UIViewRepresentable {
let request: URLRequestfuncmakeUIView(context: Context) -> WKWebView {
let webConfiguration =WKWebViewConfiguration()
let wkcontentController =WKUserContentController()
wkcontentController.add(context.coordinator, name: "test")
webConfiguration.userContentController = wkcontentController
let webView =WKWebView(frame: .zero, configuration: webConfiguration)
context.coordinator.parent = webView // inject as weakreturn webView
}
funcupdateUIView(_view: WKWebView, context: Context) {
if view.url ==nil {
view.load(request)
}
}
funcmakeCoordinator() -> ContentController {
ContentController() // let handler be a coordinator
}
classContentController: NSObject, WKScriptMessageHandler {
weakvar parent: WKWebView? // weak to avoid reference cyclingfuncuserContentController(_userContentController: WKUserContentController,
didReceivemessage: WKScriptMessage) {
if message.name =="test" {
print(message.body)
parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'red'",
completionHandler: nil)
}
}
}
}
Solution 2:
The answer is to pass WKWebview to ContentController() instead of nil
Here is a working example;
structWebView: UIViewRepresentable {
let request: URLRequestfuncmakeUIView(context: Context) -> WKWebView {
returnWKWebView()
}
funcupdateUIView(_view: WKWebView, context: Context) {
let contentController =ContentController(view)
let userScript =WKUserScript(source: "document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'black'; alert('from iOS')", injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: true)
view.configuration.userContentController.add(contentController, name: "test")
view.configuration.userContentController.addUserScript(userScript)
view.evaluateJavaScript("document.body.style.backgroundColor = '#4287f5';", completionHandler: nil)
view.load(request)
}
classContentController: NSObject, WKScriptMessageHandler {
var parent: WKWebView?
init(_parent: WKWebView?) {
self.parent = parent
}
funcuserContentController(_userContentController: WKUserContentController, didReceivemessage: WKScriptMessage) {
parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'red';", completionHandler: nil)
print("from test")
}
}
}
Post a Comment for "Evaluatejavascript In Swiftui"