【问题标题】:Swift WKWebView interface with javascript is not run没有运行带有 javascript 的 Swift WKWebView 界面
【发布时间】:2019-09-03 09:14:22
【问题描述】:

我只是使用带有 swift 4.0 (iOS 12.1) 的 WKWebView 构建我的应用程序

我需要从在线 html 运行我的 javascript, 但是,如果我将 url 从索引移动到另一个页面, 我的打印消息根本不起作用。

    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)

当我移动到 webView 中的另一个 html 页面时,我错过了 userContentController。索引页面可以调用这个,但另一个页面不调用任何函数。

index.html(ok) -> 链接到 a.html -> a.html (not ok) -> 链接到 index.html -> index.html(ok)

不要叫这个:

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")
    }
}

我什至根本无法收到任何消息,甚至“呼叫打印输出”。 如何在我的代码中激活 userContentController?

【问题讨论】:

  • 您是否在您的info.plist 文件中添加了App Transport Security Settings?你可以看看这个问题:stackoverflow.com/questions/32456848/…
  • 当然,我所有的 url 都使用 https 协议。
  • @axel 最后我发现这是由 Xcode 10.2 错误引起的。Xcode 10.1 没有报告任何问题... :( 感谢您的协助 axel :)
  • 很高兴你知道了@Richard
  • @Richard 你还记得问题到底是什么或者你是怎么发现的吗?我遇到了同样的问题,javascript 代码适用于 iOS 12 和 12.2,但不适用于 12.1。有什么提示吗?

标签: javascript swift webview call wkwebview


【解决方案1】:

必须通过WKPreferences 启用Javascript。您可以在 WKWebViewConfiguration 的 preferences 字段中指定这些。 默认情况下禁用Javascript。

您只需将首选项对象的javaScriptEnabled 字段设置为true。首选项对象可以更改几个有用的设置。我会敦促您查看文档。

具体来说,初始化WKWebView 的代码应如下所示。

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您可能还想看看this question。我没有将您的标记为重复,因为您的问题是询问为什么 javascript 不起作用,而不是如何启用它。

编辑: JavaScript 现在默认启用。这个答案不再准确。

【讨论】:

  • @Richard 您发布的代码 sn-p 告诉我您没有。您是否省略了启用 js 的行?
  • @Rosenbloom 天哪.. 我怎么了?我的 mac pro 的 Xcode 10.2 无法解决此问题,但另一本 mac book pro 10.1 对此没有任何问题。我认为这是 Xcode 10.2 的错误。哦,天哪 :( 无论如何,谢谢 Rosenbloom。
  • @Richard 我不明白。出了什么问题?
  • @Richard 我也在使用相同的 xcode 10.2。这个问题是关于这个还是其他的。以及我们如何检查我们的 Javascript 是否已加载?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 2019-08-03
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多