web-dev-qa-db-fra.com

Forcer un lien WebView pour lancer Safari?

J'ai une UIWebView intégrée dans une de mes applications iPhone. Je veux pouvoir ouvrir certains liens de cette vue Web dans l'application Mobile Safari complète (c'est-à-dire pas dans ma version intégrée).

Existe-t-il un moyen simple de structurer certaines de mes hrefs pour forcer cela, au lieu de chaque ouverture de lien dans ma vue Web intégrée?

Merci.

41
tbacos

Pour développer ce que Randy a dit, voici ce que j'utilise dans mon application pour ouvrir chaque http: //, https: // et mailto: // URL dans les applications externes Safari ou 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; 
}

Comme le dit Randy, vous voudrez l'implémenter dans la classe que vous définissez comme étant le délégué de l'UIWebView. Pour que seules les URL sélectionnées lancent Safari, vous pouvez changer leur schéma de http: // en safari: //, ou quelque chose de similaire, et ne lancer ces URL que sur le système (après avoir remplacé le schéma d'URL personnalisé par http: //) .

Je le fais dans ma documentation d'aide interne, qui est du HTML affiché dans une UIWebView, afin de ne pas rencontrer de problèmes dans le processus de révision avec un navigateur Web à usage général intégré dans mon application.

60
Brad Larson

OK j'ai compris. Ce n'est peut-être pas la solution parfaite, mais vous pouvez le faire comme ceci:

Uniquement dans votre WebViewController.m:

ajoutez la ligne webView.delegate = self; à la procédure viewDidLoad:

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

Ensuite, vous pouvez ajouter comme décrit ci-dessus quelque part dans le Controller.m Fichier suivant la fonction résultante booléenne:

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

Je n'ai pas essayé cela moi-même mais je pense que vous pouvez implémenter la méthode UIWebViewDelegate

webView:shouldStartLoadWithRequest:navigationType 

qui sera appelé à chaque fois que l'on cliquera sur un lien dans UIWebView. Dans cette méthode, il vous suffit de déterminer si le lien cliqué doit entraîner le lancement de Safari ou non et d'utiliser openURL si tel est le cas.

- (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;
}

N'oubliez pas que vous devez définir votre propriété déléguée UIWebView sur une instance de la classe qui implémente UIWebViewDelegate.

12
Randy Simon

Voici comment nous l'avons résolu, ajoutez ceci à votre fichier 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;
}
1
Dwight Mix

Version rapide de la réponse de Brad Larson:

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
Carl Sharman