Skip to content Skip to sidebar Skip to footer

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"