2

I just build my app with WKWebView with swift 4.0 (iOS 12.1)

I need to run my javascript from online html, However if I move url from index to another page, my print message does not working at all.

    let contentController = WKUserContentController()
    contentController.add(self, name: "myHandler") 

    let configuration = WKWebViewConfiguration()
    configuration.userContentController = contentController

    webview = WKWebView(frame: self.view.frame, configuration: configuration)
    webview.uiDelegate = self
    webview.navigationDelegate = self
    self.view = self.webview


override func viewDidLoad() {
    super.viewDidLoad()
    let url = URL(string: "example.com/index") // of course https://
    let request = URLRequest(url: url!)
    webview.load(request)

I missed userContentController when I move to another html page in the webView. Index page can call this one but another page do not call any function.

index.html(ok) -> link to a.html -> a.html (not ok) -> link to index.html -> index.html(ok)

Do not Call this one :

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    print("call print out")
    if message.name == "myHandler" {
        print("JS -> Native Call \(message.body)")
        abc()
    } else {
        print("JS -> Native N/A")
    }
}

I cannot get any message even "call print out" at all. How can I active userContentController in my code?

5
  • Did you added App Transport Security Settings in your info.plist file? You can have a look to this question: stackoverflow.com/questions/32456848/… Commented Apr 12, 2019 at 15:18
  • Sure, All of my url is using with https protocol. Commented Apr 12, 2019 at 15:31
  • @axel Finally I found that this was caused by Xcode 10.2 bugs.. Xcode 10.1 do not report any issue for this... :( I appreciate your assist axel :) Commented Apr 14, 2019 at 13:07
  • Glad that you figured it out @Richard Commented Apr 15, 2019 at 8:02
  • @Richard do you remember what exactly the issue was or how you found it? I'm running into the same problem, javascript code works on iOS 12 and 12.2 but not on 12.1. Any hints? Commented Jul 11, 2019 at 16:28

2 Answers 2

2

Javascript must be enabled through WKPreferences. You can specify these in the preferences field of you WKWebViewConfiguration. Javascript is disabled by default.

You simply need to set the javaScriptEnabled field of the preferences object to true. There are several useful settings that can be changed by the preferences object. I would urge you to look at the documentation.

Specifically your code to initialize the WKWebView should look like this.

let contentController = WKUserContentController()
contentController.add(self, name: "myHandler") 

let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
configuration.preferences = WKPreferences()
configuration.preferences.javaScriptEnabled = true

webview = WKWebView(frame: self.view.frame, configuration: configuration)
webview.uiDelegate = self
webview.navigationDelegate = self
self.view = self.webview

PS You may also want to have a look at this question. I'm not marking yours as a duplicate because your question asks why javascript isn't working, not how to enable it.

EDIT: JavaScript is now enabled by default. This answer is no longer accurate.

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

11 Comments

@Richard the code snippet you posted tells me that you did not. Are you omitting the lines where you enable js?
@Richard if you're not sure what I mean by that, I have replaced my previous brief example with a more thorough demonstration of what enabling js should look like.
@Rosenbloom Oh my god.. what happen to me? My mac pro had Xcode 10.2 cannot resolve this issue but another mac book pro 10.1 had no issue for this.. I think it is a Xcode 10.2 bugs.. Oh my goodness :( Anyway thank you Rosenbloom.
@Richard I don’t understand. What was the problem?
@Richard I am also using the same xcode 10.2. Is this issue regarding this or anything else. And how we can check that our Javascript is loaded?
|
2

Correct usage as of iOS 14+

let contentController = WKUserContentController()
contentController.add(self, name: "myHandler") 

let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
configuration.preferences = WKPreferences()

// Here's the new magic for iOS 14:
let webPageDefaultPrefs = WKWebpagePreferences()
webPageDefaultPrefs.allowsContentJavaScript = true
config.defaultWebpagePreferences = webPageDefaultPrefs

webview = WKWebView(frame: self.view.frame, configuration: configuration)
webview.uiDelegate = self
webview.navigationDelegate = self
self.view = self.webview

Comments

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.