13

I am trying to understand the best way to execute javascript with WKWebview

Could someone please give me the use cases / best practices when using WKWebView.

When to use addUserScript and WKScriptMessageHandler and when to use evaluateJavaScript

    let jscript = "my script"
    let userScript = WKUserScript(source: jscript, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
    let userContentController = WKUserContentController()
    userContentController.addUserScript(userScript)

    let webViewConfiguration = WKWebViewConfiguration()
    webViewConfiguration.userContentController = userContentController
    webView = WKWebView(frame: self.view.bounds, configuration: webViewConfiguration)

vs

let myScript
self.wkWebView.evaluateJavaScript(script) { (result, error) in
    if error != nil {
        print("\(error)")
    }
}

2 Answers 2

9

Found a nice explanation

http://jonathanblog2000.blogspot.co.il/2016/11/understanding-ios-wkwebview.html

2.3.2 Inject javascript from native code to js DOM emphasized text WKUserContentController allows add (and remove) a WKUserScript to be injected either when the DOM tree starts to load or finishes to load. On the contrary, evaluateJavaScript allows application to execute a javascript snippet on demand at any time.

Sign up to request clarification or add additional context in comments.

Comments

3

In my experience, WKUserScript seems to have more privileges, eg: document.cookie="test=test" works with WKUserScript but not with evaluateJavaScript.

However, WKUserScript requires an additional reload() for the javascript you injected to run. It maybe a bug. Sometimes it complicates the code.

WKScriptMessageHandler is a separate thing. It allows your native app to receive messages from javascript. eg, you can add a handler and receives message that is posted from javascript like: "window.webkit.messageHandlers.notification.postMessage({body: "..."});" Refer: http://nshipster.com/wkwebkit/

Pretty cool stuff that doesn't exist in UIWebView

1 Comment

You can use evaluateJavaScript:completionHandler: method to inject cookies. However, you should be careful because it only works after the webview:didFinishNavigation: gets called. And WKUserScript doesn't need additional reload() action if you add it to contentController before webView loads request.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.