在Safari中的UIWebView外部打开target ="_ blank"链接

Nor*_*ld2 20 uiwebview ios4 ios ios5

在我的iOS应用程序中,我有一个UIWebView.

现在我希望所有具有属性target ="_ blank"的链接不在我的WebView中打开,而是在Safari中外部打开.

我怎样才能做到这一点?

Ben*_*tte 38

我的答案,这是我在Android WebView的堆栈溢出中找到的答案.但实际上,两个webview都有相同的问题和相同的(脏)修复:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request     navigationType:(UIWebViewNavigationType)navigationType
{
    if ([request.URL.absoluteString hasPrefix:@"newtab:"])
    {
        // JS-hacked URl is a target=_blank url - manually open the browser.
        NSURL *url = [NSURL URLWithString:[request.URL.absoluteString substringFromIndex:7]];
        [[UIApplication sharedApplication] openURL:url];

        return true;
    }

    return true;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // JS Injection hack to solve the target="_blank" issue and open a real browser in such case.
    NSString *JSInjection = @"javascript: var allLinks = document.getElementsByTagName('a'); if (allLinks) {var i;for (i=0; i<allLinks.length; i++) {var link = allLinks[i];var target = link.getAttribute('target'); if (target && target == '_blank') {link.setAttribute('target','_self');link.href = 'newtab:'+link.href;}}}";
    [webView stringByEvaluatingJavaScriptFromString:JSInjection];
}
Run Code Online (Sandbox Code Playgroud)

这解决了在safari中打开的target ="_ blank"问题,并且在webview中保持打开标准链接.


Mar*_*ian 5

wedo解决方案的问题在于,所有链接都将在Safari中打开。

两种解决方案:

1-当target =“ _ blank”时,JavaScript回调到Objective-C
为了解决您的问题,您需要在所有链接上添加一些javascript,检查它们是否具有_blank属性,然后从JavaScript调用Objective-C代码并运行:

[[UIApplication sharedApplication] openURL:myUrl];
Run Code Online (Sandbox Code Playgroud)

我个人不喜欢这种解决方案,因为它包含很多代码,回调,复杂性以及一些棘手的问题……

2-检查url参数
如果可以访问HTML代码(在两种解决方案中都需要访问HTML),建议您删除target =“ _ blank”并添加参数?openInSafari = true

在UIWebViewDelegate中添加以下代码:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        NSURL *url = [request URL];
        NSDictionary *param = [url queryParameters];
        NSString *openIsSafari = [param objectForKey:@"openInSafari"];

        if ( openIsSafari!= nil && ([openIsSafari isEqualToString:@"true"] ||  [openIsSafari isEqualToString:@"1"])){
            [[UIApplication sharedApplication] openURL:url];
            return NO;
        }
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

此解决方案的一个好点(不好?)是,如果链接x级别更深,仍然可以打开指向Safari浏览器的链接

<a href="http://www.google.com?openInSafari=true">Google in Safari</a>
Run Code Online (Sandbox Code Playgroud)


始终在URL中添加协议(http,https ...)