Заставить ссылку WebView запустить Safari? - PullRequest
41 голосов
/ 28 марта 2010

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

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

Спасибо.

Ответы [ 5 ]

61 голосов
/ 28 марта 2010

Чтобы расширить сказанное Рэнди, вот что я использую в своем приложении, чтобы каждый 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. Чтобы запускать Safari только по выбранным URL-адресам, вы могли бы изменить их схему с http: // на safari: // или что-то подобное, и отправлять только эти URL-адреса в систему (после замены пользовательской схемы URL-адреса на http://).

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

20 голосов
/ 01 января 2011

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

Только в вашем 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;
}
12 голосов
/ 28 марта 2010

Я сам не пробовал, но думаю, что вы можете реализовать метод 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.

1 голос
/ 04 июня 2015

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

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
    }
}
1 голос
/ 26 июля 2013

Вот как мы решили это, добавьте это в ваш файл 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...