最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Swift WKWebView interface with javascript is not run - Stack Overflow

programmeradmin1浏览0评论

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/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?

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./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?

Share Improve this question edited Apr 13, 2019 at 9:14 Richard asked Apr 12, 2019 at 14:57 RichardRichard 3514 silver badges18 bronze badges 5
  • Did you added App Transport Security Settings in your info.plist file? You can have a look to this question: stackoverflow./questions/32456848/… – axel Commented Apr 12, 2019 at 15:18
  • Sure, All of my url is using with https protocol. – Richard 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 :) – Richard Commented Apr 14, 2019 at 13:07
  • Glad that you figured it out @Richard – axel 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? – André Herculano Commented Jul 11, 2019 at 16:28
Add a ment  | 

2 Answers 2

Reset to default 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.

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
发布评论

评论列表(0)

  1. 暂无评论