Richard
Richard

Reputation: 351

Swift WKWebView interface with javascript is not run

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?

Upvotes: 2

Views: 6409

Answers (2)

drewster
drewster

Reputation: 6130

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

Upvotes: 2

William Rosenbloom
William Rosenbloom

Reputation: 2636

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.

Upvotes: 2

Related Questions