我可以在UIWebViewDelegate中处理警报吗?

 alert("Hell! UIWebView!");  

我可以在UIWebView中看到警报消息但是我可以处理这种情况吗?

更新:

我正在将一个网页加载到我的UIWebView中:

 - (void)login { NSString *requestText = [[NSString alloc] initWithFormat: @"%@?user=%@&password=%@", DEFAULT_URL, user.name, user.password]; // YES, I'm using GET request to send password :) NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:requestText]]; [webView loadRequest:request]; } 

目标页面包含JS。 如果用户名或密码不正确,则此JS显示警报。 我没有任何访问其来源。 我想在我的UIWebViewDelegate中处理它。

如果通过“包含一个闪存”你的意思是你加载到你的网页视图中的页面中有一个Adobe Flash电影,你很幸运,我很害怕。 Mobile Safari不支持Flash,很可能永远不会。

在一般情况下,如果您希望在Web视图中运行的JavaScript与托管它的本机应用程序通信,您可以加载虚假URL(例如:“myapp:// alert?+ + + + + alert + +的文本+这里+“)。 这将触发webView:shouldStartLoadWithRequest:navigationType: delegate方法。 在该方法中,检查请求,如果正在加载的URL是这些内部通信之一,则在您的应用程序中触发相应的操作,并返回NO

解决此问题的更好方法是为该方法创建UIWebView的类别

 webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame: 

这样您就可以以任何方式处理警报事件。 我这样做是因为我不喜欢UIWebView的默认行为,因为它将源文件名放在UIAlertView标题中。 类别看起来像这样,

 @interface UIWebView (JavaScriptAlert) - (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame; @end @implementation UIWebView (JavaScriptAlert) - (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame { UIAlertView* dialogue = [[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil]; [dialogue show]; [dialogue autorelease]; } @end 

这似乎是这样做的:

 - (void)webViewDidFinishLoad:(UIWebView *)webView { JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; ctx[@"window"][@"alert"] = ^(JSValue *message) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"JavaScript Alert" message:[message toString] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; }; } 

注意:仅在iOS 8上测试过。