iOS WKWebView不显示javascript alert()对话框

我有一些麻烦在iOS 8中获取WKWebView显示从Javascript调用的警报对话框。 在创build一个标准的WKWebView并加载一个HTML文件后,我在页面上有一个button,用一些文本创build一个简单的警报。 这在UIWebView和谷歌浏览器/ Safari中工作,但似乎没有工作在WKWebView。 任何帮助表示赞赏。

我的设置如下:

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; config.allowsInlineMediaPlayback = YES; config.mediaPlaybackRequiresUserAction = false; _wkViewWeb = [[WKWebView alloc] initWithFrame:_viewWeb.frame config]; _wkViewWeb.scrollView.scrollEnabled = NO; NSString *fullURL = @"file://.../TestSlide.html"; NSURL *url = [NSURL URLWithString:fullURL]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; [_wkViewWeb loadRequest:request]; 

该html有以下function:

 <SCRIPT Language="JavaScript"> function alertTest() { alert("Testing Alerts"); } </SCRIPT> 

和一个button:

 <b>Test Alerts: <input type="button" value="Alert Popup" onclick="alertTest()"><br></b> <br> 

此设置在UIWebView和常规浏览器中工作,但在WKWebView中不起作用。 我在configuration中丢失了什么? 我是否应该使用WK代表之一来控制警报/确认对话行为? 谢谢。

为了解决这个问题,你需要一个WKUIDelegate用于你的网页视图。 代表有责任决定是否显示警报,并以何种方式显示。 你需要实现这个警报,确认和文本input(提示)。

这里是示例代码没有任何validation的网页url或安全function:

 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { completionHandler(); }]]; [self presentViewController:alertController animated:YES completion:^{}]; } 

更多的官方文档

Swift 3与所有3个可选function实施:

 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() })) 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) })) 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) })) present(alertController, animated: true, completion: nil) } 

这就是迅速

 func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: () -> Void) { let alertController = UIAlertController(title: message, message: nil, preferredStyle: UIAlertControllerStyle.Alert); alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel) { _ in completionHandler()} ); self.presentViewController(alertController, animated: true, completion: {}); } 

为了扩展一下, WKWebView要求你显示警报,提示和确认你自己。 通过成为一个WKUIDelegate做到这WKUIDelegate

 #import <WebKit/WebKit.h> @interface MyController : UIViewController<WKUIDelegate> 

然后分配代表:

 web.UIDelegate = self; 

然后你需要实际执行警报,提示和确认。 我创build了WKWebViewPanelManager.h / m作为一个简单的实现,所以这就是我所做的:

 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler { [WKWebViewPanelManager presentAlertOnController:self.view.window.rootViewController title:@"Alert" message:message handler:completionHandler]; } - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler { [WKWebViewPanelManager presentConfirmOnController:self.view.window.rootViewController title:@"Confirm" message:message handler:completionHandler]; } - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler { [WKWebViewPanelManager presentPromptOnController:self.view.window.rootViewController title:@"Prompt" message:prompt defaultText:defaultText handler:completionHandler]; } 

当然,这是由你来筛选出不良的警报/确认/提示请求。