306 votes

Liens ouverts UIWebView dans Safari

J'ai un UIWebView très simple avec le contenu de mon ensemble d'applications. Je souhaite que tous les liens de la vue Web s'ouvrent dans Safari plutôt que dans la vue Web. Est-ce possible?

658voto

drawnonward Points 35444

Ajouter ceci au délégué UIWebView :

(édité pour vérifier la navigation type. vous pouvez également passer par `` les demandes qui seraient des liens relatifs)

44voto

DiegoFrings Points 560

Si quelqu'un se demande, solution de Drawnonward ressemblerait à ceci à Swift:

28voto

MonsieurDart Points 3133

Un commentaire rapide pour la réponse d’user306253 : attention, lorsque vous essayez de charger quelque chose dans l’UIWebView vous-même (c'est-à-dire même du code), cette méthode permettra d’éviter qu’il s’est passé.

Ce que vous pouvez faire pour empêcher cela (Merci Wade) est :

Vous pouvez également gérer les et types.

16voto

KPM Points 1679

Les autres réponses ont un problème: ils s'appuient sur l'action que vous faites et non pas sur le lien lui-même de décider de le charger dans Safari ou dans webview.

Maintenant, parfois, c'est exactement ce que vous voulez, ce qui est bien; mais d'autres fois, surtout si vous avez des liens d'ancrage dans votre page, vous voulez vraiment pour ouvrir uniquement les liens externes dans Safari, et non interne. Dans ce cas, vous devriez vérifier l' URL.host de la propriété de votre demande.

J'utilise ce bout de code pour vérifier si j'ai un nom de domaine dans l'URL qui est analysée, ou si elle est incorporée html:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    static NSString *regexp = @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9])[.])+([A-Za-z]|[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9])$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexp];

    if ([predicate evaluateWithObject:request.URL.host]) {
        [[UIApplication sharedApplication] openURL:request.URL];
        return NO; 
    } else {
        return YES; 
    }
}

Vous pouvez bien sûr l'adapter à l'expression régulière pour s'adapter à vos besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X