我正在使用WKWebView打开example.com,在那儿我有一个测试链接,该链接应该打开JS警报,但是我无法在设备上显示它,仅当我查看该网站时,它才能工作从浏览器。

我正在使用WKUIDelegate,并将这段代码添加到ViewController.swift文件中:

func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: (() -> Void)) {

    NSLog("Hello")
}

当我单击生成JS警报的链接时,在XCode控制台中看不到任何内容。

我想念什么?

最佳答案

有点晚了,但我想补充一下我的经验,以供将来引用。 @Bon Bon的答案将我带到了解决方案的道路上,而我试图使它与 Swift 3 和IOS 10一起工作,在这种情况下,代码需要进行一些修改。
首先,您还需要实现WKUIDelegate,因此将其添加到ViewController声明中:

class ViewController: UIViewController, WKUIDelegate {

然后,当您实例化WKWebView对象时,例如这样:
self.webView = WKWebView(frame: self.view.frame)

您还需要为实例的uiDelegate属性分配正确的值:
self.webView?.uiDelegate = self

最后,您可以使用@Bon Bon提供的代码,但是请注意,Swift 3需要一些小的区别,例如,presentViewController方法的名称变为present:
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)

    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
        completionHandler()
    }))

    self.present(alertController, animated: true, completion: nil)
}

func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)

    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
        completionHandler(true)
    }))

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
        completionHandler(false)
    }))

    self.present(alertController, animated: true, completion: nil)
}

func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {

    let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .alert)

    alertController.addTextField { (textField) in
        textField.text = defaultText
    }

    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
        if let text = alertController.textFields?.first?.text {
            completionHandler(text)
        } else {
            completionHandler(defaultText)
        }

    }))

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in

        completionHandler(nil)

    }))

    self.present(alertController, animated: true, completion: nil)
}

这使得alertconfirmationtext inputWKWebView内正常工作,而在 Xcode 8 中没有任何编译器警告。我不是Swift专家,所以对代码正确性的任何有用评论都将不胜感激。

10-08 03:24