一尘不染

WKWebView-Javascript确认和警报不起作用

swift

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

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

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

    NSLog("Hello")
}

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

我想念什么?


阅读 309

收藏
2020-07-07

共1个答案

一尘不染

有点晚了,但我想补充一下我的经验以供将来参考。当我尝试使 Swift 3 和IOS 10 能够正常工作时,@ Bon
Bon的答案将我带到了解决方案的道路上,在这种情况下,代码需要进行一些修改。首先,您还需要实现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 input以正常工作范围内WKWebView,没有任何编译器警告 的Xcode
8
。我不是Swift专家,所以对于代码正确性的任何有用评论都将不胜感激。

2020-07-07