UIWebview: открыть определенные ссылки в сафари (не все) - PullRequest
0 голосов
/ 29 августа 2010

У меня есть веб-страница в uiwebview .. На этой странице есть пара ссылок http: //.Один из них, я хочу открыть его в сафари.Остальное можно открыть в 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: // url в safari, а остальное - в UIWebview.Но не повезло.Кажется, здесь работают только стандартные вещи (например, http https tel mailto и sms).Есть идеи как обойти это?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Мне нужно было сделать то же самое и использовать приведенный выше код в качестве отправной точки для моего решения.Проблема с тем, что ссылки 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;
    }

} 
0 голосов
/ 29 августа 2010

Надеясь, что это откроет сафари: // URL в сафари, а остальные в UIWebView. Но не повезло.

Здесь вы не говорите точно , почему это не работает. Можете ли вы предоставить более подробную информацию - что вы пробовали, что вы ожидали и что произошло вместо этого?

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

Этот код не нужен (вам не нужно сохранять этот объект) и вызывает утечку памяти (перемещение по пути кода, который вводит первый оператор if и return s)

// Auto release

Этот комментарий вводит в заблуждение, поскольку вы не используете autorelease в своем коде.

Ваш код также может быть прочитан [(([[bit] hard] to)) со (всеми) [[те] скобками] и (пробелами)]. Форматировать код - используйте кнопку «101 010» для форматирования. Я немного исправил это для вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...