Заставить ссылку WebView для запуска Safari?

У меня есть UIWebView, встроенный в мое приложение iPhone. Я хочу иметь определенные ссылки в этом веб-браузере, которые можно открыть в полном приложении Mobile Safari (т.е. Не в моей встроенной версии).

Есть ли простой способ структурировать некоторые из моих hrefs, чтобы заставить это, а не каждое открытие ссылок внутри моего встроенного веб-представления?

Спасибо.

Ответ 1

Чтобы расширить то, что сказал Рэнди, это то, что я использую в своем приложении, чтобы каждый внешний URL-адрес http://, https://и mailto://открывался во внешних приложениях Safari или Mail:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 
{
    NSURL *requestURL =[ [ request URL ] retain ]; 
    if ( ( [ [ requestURL scheme ] isEqualToString: @"http" ] || [ [ requestURL scheme ] isEqualToString: @"https" ] || [ [ requestURL scheme ] isEqualToString: @"mailto" ]) 
        && ( navigationType == UIWebViewNavigationTypeLinkClicked ) ) { 
        return ![ [ UIApplication sharedApplication ] openURL: [ requestURL autorelease ] ]; 
    } 
    [ requestURL release ]; 
    return YES; 
}

Как говорит Рэнди, вы захотите реализовать это в любом классе, который вы назначили делегатом UIWebView. Чтобы только выбрать URL-адреса, запустите Safari, вы можете изменить их схему с http://на safari://или что-то подобное, и только удалите эти URL-адреса в систему (после замены схемы пользовательских URL с помощью http://).

Я делаю это в своей внутренней справочной документации, которая отображается в HTML в UIWebView, поэтому я не сталкиваюсь с проблемами в процессе обзора с использованием встроенного в мое приложение универсального веб-браузера.

Ответ 2

Хорошо, я понял. Возможно, это не идеальное решение, но вы можете сделать это вот так:

Только в WebViewController.m:

добавьте строку webView.delegate = self; в процедуру viewDidLoad:

- (void)viewDidLoad {
    webView.delegate = self;
    .... your code ....
}

Затем вы можете добавить, как описано выше, в файл Controller.m после следующей логической результирующей функции:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        [[UIApplication sharedApplication] openURL:request.URL];
        return false;
    }
    return true;
}

Ответ 3

Я не пробовал это сам, но я думаю, что вы можете реализовать метод UIWebViewDelegate

webView:shouldStartLoadWithRequest:navigationType 

который будет вызываться в любое время, когда будет нажата ссылка в UIWebView. В этом методе вам просто нужно определить, приведет ли ссылка с кликом к запуску Safari или нет, и использовать openURL, если это необходимо.

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

    // Check if this was a click event and then some other criteria for determining if you want to launch Safari.
    if (navigationType == UIWebViewNavigationTypeLinkClicked && [Some other criteria]) {
        [[UIApplication sharedApplication] openURL:request.URL];

        // Return false to indicate to the UIWebView to not navigate to the linked target
        return false;
    }

    // Return true so that the UIWebView loads the link target
    return true;
}

Не забывайте, что вам нужно установить свойство делегата UIWebView экземпляру класса, который реализует UIWebViewDelegate.

Ответ 4

Вот как мы его решили, добавим в файл ViewController.m:

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    first.delegate = (id)self;
                [first loadRequest:[NSURLRequest requestWithURL:[NSURL     URLWithString:@"http://my.FellowshipNWA.org?publicapp"]]];
}

// Add section below so that external links & PDFs will open in Safari.app
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request     navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeOther) {
        NSString *checkURL = @"http://my.fellowshipnwa.org/?givenowsafari";
        NSString *reqURL = request.URL.absoluteString;
        if ([reqURL isEqualToString:checkURL])
             {
                 [[UIApplication sharedApplication] openURL:request.URL];
            return false;
    }
        else {
            return true;
        }
    }
    return true;
}

Ответ 5

Быстрая версия ответа Брэда Ларсона:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    var url: NSURL = request.URL!
    var isExternalLink: Bool = url.scheme == "http" || url.scheme == "https" || url.scheme == "mailto"
    if (isExternalLink && navigationType == UIWebViewNavigationType.LinkClicked) {
        return !UIApplication.sharedApplication().openURL(request.URL!)
    } else {
        return true
    }
}