我正在使用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)
}
这使得
alert
,confirmation
和text input
在WKWebView
内正常工作,而在 Xcode 8 中没有任何编译器警告。我不是Swift专家,所以对代码正确性的任何有用评论都将不胜感激。