UIWebview:在safari中打开某些链接(不是全部)

时间:2010-08-29 08:49:52

标签: iphone xcode uiwebview

我在uiwebview中有一个网页..在这个页面上有几个http://链接。其中一个我想在safari中打开它。其余的可以在UIWebview中打开。 到目前为止我使用了这段代码;

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
{  
    NSURL *requestURL = [ [ request URL ] retain ];  
    // Check to see what protocol/scheme the requested URL is.  
    if ( ( [ [ requestURL scheme ] isEqualToString: @"http" ]  
    || [ [ requestURL scheme ] isEqualToString: @"https" ] )  
        && ( navigationType == UIWebViewNavigationTypeLinkClicked ) ) {  
        return ![ [ UIApplication sharedApplication ] openURL: [ requestURL autorelease ] ];  
    }  
    // Auto release  
    [ requestURL release ];  
    // If request url is something other than http or https it will open  
    // in UIWebView. You could also check for the other following  
    // protocols: tel, mailto and sms  
    return YES;  
} 

这适用于http和https等。我的想法是让网站的一个链接指向safari://blah.com并将上面的代码更改为;

if ( ( [ [ requestURL scheme ] isEqualToString: @"safari" ]  
|| [ [ requestURL scheme ] isEqualToString: @"https" ] )  

希望这会在safari中打开safari:// url,在UIWebview中打开其余部分。但没有运气。 似乎只有标准的东西(如http https tel mailto和sms)在这里工作。 任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

我需要做同样的事情,并使用上面的代码作为我的解决方案的起点。 safari://链接无法打开的问题是它不是真正有效的方案,需要先改为http://。希望这可以帮助任何需要这样做的人。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {  

    // Make sure it's a link click that called this function.
    if ( navigationType == UIWebViewNavigationTypeLinkClicked ) {
        NSURL *requestURL = [ request URL ];  

        // Check to see what protocol/scheme the requested URL is.
        if ( [[requestURL scheme] isEqualToString: @"http"] || [[requestURL scheme] isEqualToString: @"https"] ) { 

            // If it is HTTP or HTTPS, just return YES and the page loads.

            return YES;

        } else  {

            // Everything else loads here.  We assume what we're dealing with is safari://

            // It's important to replace safari:// with http:// or it won't load anyway
            [[ UIApplication sharedApplication ] openURL: [NSURL URLWithString: [[requestURL absoluteString] stringByReplacingOccurrencesOfString:@"safari://" withString:@"http://"] ]];
            return NO;

        }

    } else {
        return YES;
    }

} 

答案 1 :(得分:0)

  

希望这会打开野生动物园://   在野生动物园和其他地方的网址   UIWebView的。但没有运气。

这里你没有准确地说为什么它不起作用。你能提供更多的细节 - 你尝试了什么,你期待什么,以及发生了什么?

NSURL *requestURL = [ [ request URL ] retain ];  

此代码是不必要的(您不需要保留该对象)并产生内存泄漏(沿着输入第一个if语句和return s的代码路径行进

// Auto release

此评论具有误导性,因为您未在代码中使用autorelease

你的代码也是[(([[bit] hard] to)read)with(all)[[那些]括号]和(空格)]不要使用“code”或“pre”标签来格式代码 - 使用“101 010”按钮进行格式化。我已经为你修好了一下