iOS UIWebView打开新窗口时发生的事件

iOS UIWebView打开新窗口时发生的事件

问题描述:



我尝试创建一个显示webview的iOS应用程序,但我想要显示的网站有时会打开一个新窗口。 (window.open)我没有问题在其他设备上添加侦听器,并在应用程序尝试打开新窗口时执行某些操作,但在iOS上我不知道如何创建此类侦听器。

有没有办法在应用程序尝试打开新窗口时添加侦听器并执行某些操作?

目前,当我点击一个带有window.open的链接时,该应用会在顶部打开一个新的webview,并且无法返回到旧视图。iOS UIWebView打开新窗口时发生的事件

- (BOOL)webView:(UIApplication*)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ 
    NSString *url = request.URL.absoluteString; 
    if (navigationType == UIWebViewNavigationTypeLinkClicked && [url rangeOfString:@"........].location==NSNotFound){ 
     [[UIApplication sharedApplication] openURL:[request URL]]; 
     NSLog(@"opening link on default browser"); 
     return NO; 
    } 
    return YES; 
} 

- (void) webViewDidFinishLoad:(UIWebView *)webView{ 
    NSLog(@"webViewDidFinishLoad\n"); 
} 

请参阅UIWebViewDelegate及其方法webView的:shouldStartLoadWithRequest:navigationType:和webViewDidFinishLoad :.

+0

是的,这就是我完成了。但我不知道如何添加一个委托来检查应用程序是否会打开一个新窗口 – Guillaume

+1

您是否试过这个:http://longweekendmobile.com/2010/09/14/making-target-_blank-links-work -in-a-uiwebview /? –

+0

其实我觉得这不是同一个问题。我在解释中犯了一个错误。我认为这是一个目标空白,但它是一个JavaScript代码window.open – Guillaume

你应该做的是确定URL是否会被外部打开。

- (BOOL)isExternal:(NSURL*)url { 
    BOOL isExternal = NO; 
    if (![url.scheme isEqual:@"http"] && ![url.scheme isEqual:@"https"]) { 
     if ([[UIApplication sharedApplication] canOpenURL:url]) { 
      isExternal = YES; 
     } 
    } 
    return isExternal; 
} 

然后从UIWebViewDelegate,用这种方法来决定将来是否允许URL的负载:

您可以使用以下为此

-(BOOL)webView:(UIApplication*)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ 
    BOOL allowToLoad = ([self isExternal:request.URL] == NO); 
    return allowToLoad; 
} 
+0

谢谢你的回答。我在我的代码上试过这个,它似乎不工作。我的应用程序仍然为一些链接打开一个新窗口,并且isExternal返回1. url.scheme是一个https – Guillaume