我正在使用WKWebView打开example.com,在那儿我有一个测试链接,该链接应该打开JS警报,但我无法在设备上显示该警报,仅当我查看该网站时它才能工作从浏览器。
我正在使用WKUIDelegate,并将这段代码添加到ViewController.swift文件中:
func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: (() -> Void)) { NSLog("Hello") }
当我单击生成JS警报的链接时,在XCode控制台中看不到任何内容。
我想念什么?
有点晚了,但我想补充一下我的经验以供将来参考。当我尝试使 Swift 3 和IOS 10 能够正常工作时,@ Bon Bon的答案将我带到了解决方案的道路上,在这种情况下,代码需要进行一些修改。首先,您还需要实现WKUIDelegate,因此将其添加到ViewController声明中:
WKUIDelegate
ViewController
class ViewController: UIViewController, WKUIDelegate {
然后,当您实例化WKWebView对象时,例如如下所示:
WKWebView
self.webView = WKWebView(frame: self.view.frame)
您还需要uiDelegate为实例的属性分配正确的值:
uiDelegate
self.webView?.uiDelegate = self
然后,最后您可以使用@Bon Bon提供的代码,但是请注意,Swift 3需要一些小的差异,例如,presentViewController方法的名称变为present:
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) }
这使得alert,confirmation并text input以正常工作范围内WKWebView,没有任何编译器警告 的Xcode 8 。我不是Swift专家,所以对于代码正确性的任何有用评论都将不胜感激。
alert
confirmation
text input