带有javascript的Swift WKWebView接口未运行



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

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

    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 (不确定( -> 链接到索引.html

-> 索引.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")
    }
}

我甚至根本无法收到任何消息,甚至"呼叫打印出来"。如何在代码中激活用户内容控制器?

Javascript 必须通过 WKPreferences 启用。您可以在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 您可能还想看看这个问题。我不会将您的标记为重复项,因为您的问题询问为什么 javascript 不起作用,而不是如何启用它。

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

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

最新更新