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

我正在使用WKWebView来打开example.com,并在那里我有一个testing链接,应该打开JS警报,但我不能让它显示在设备上,它只有当我查看网站从浏览器。

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

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

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

我错过了什么?

您还需要在WKWebView上设置uiDelegate。

 import UIKit import WebKit class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { var wkWebView: WKWebView! public override func viewDidLoad() { super.viewDidLoad() wkWebView = WKWebView(frame: view.bounds, configuration: WKWebViewConfiguration()) wkWebView.uiDelegate = self wkWebView.navigationDelegate = self view.addSubview(wkWebView!) let url = URL(string: "https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_alert")! wkWebView.load(URLRequest(url: url)) } func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) let title = NSLocalizedString("OK", comment: "OK Button") let ok = UIAlertAction(title: title, style: .default) { (action: UIAlertAction) -> Void in alert.dismiss(animated: true, completion: nil) } alert.addAction(ok) present(alert, animated: true) completionHandler() } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { wkWebView.evaluateJavaScript("alert('Hello from evaluateJavascript()')", completionHandler: nil) } } 

对于confirm()prompt()请参阅其他委托方法。

有点晚了,但我想补充我的经验,以供将来参考。 @Bon Bon的回答让我想起了解决scheme的途径,当时我正在尝试使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方法的名字变成了:

 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: .actionSheet) 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程序员,所以任何有关代码的正确性的有用评论将非常赞赏。

以下是Swift中各种JavaScript警报实现的示例代码:

这是所有关于在JavaScript警报转换信息到本地用户界面 ,并调用completionHandler()发送用户操作回到JavaScript引擎。

 func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: () -> Void) { let alertController = UIAlertController(title: nil, message: message, preferredStyle: .ActionSheet) alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) in completionHandler() })) self.presentViewController(alertController, animated: true, completion: nil) } func webView(webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: (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.presentViewController(alertController, animated: true, completion: nil) } func webView(webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: (String?) -> Void) { let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .ActionSheet) alertController.addTextFieldWithConfigurationHandler { (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.presentViewController(alertController, animated: true, completion: nil) }