web-dev-qa-db-fra.com

Comment puis-je ouvrir un lien externe dans Safari et non dans UIWebView de l'application?

J'ai une application Phonegap (Cordova) dans laquelle je veux charger des pages Web externes dans la fenêtre phonegap et j'ai d'autres pages Web externes que je veux charger dans safari lorsque l'utilisateur les active.

Généralement, la plupart des gens ont le problème de vouloir ouvrir un lien externe dans WebView. Définir OpenAllWhitelistURLsInWebView sur YES (dans Cordova.plist/Phongap.plist) résout ce problème.

Mais je ne veux pas ouvrir all lie la WebView, juste quelques unes.

J'espérais pouvoir appeler window.open('http://someexternalsite') pour l'ouvrir dans Safari et window.parent.location.href = 'http://mysite' pour l'ouvrir dans WebView.

Une idée comment faire ça?

29
Matthew Levine

Si les liens que vous souhaitez ouvrir dans Safari contiennent tous une chaîne commune, vous pouvez utiliser le code suivant.

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = [request URL];

    // Intercept the external http requests and forward to Safari.app
    // Otherwise forward to the PhoneGap WebView
    if ([[url scheme] isEqualToString:@"SCHEME"]) {
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    else {
        return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
    }
}

Ce code placé dans le AppDelegate.m ouvrira toutes les URL utilisant le SCHEME spécifié dans Safari. 

Je crains que c'est tout ce que je pourrais trouver.

J'espère que cela t'aides

METTRE À JOUR :  

Le code doit être placé dans MainViewControler, au moins pour cordova 2.2.0. 

La méthode est initialement commentée. Je devais l'utiliser pour rediriger les liens Google Maps: 

NSRange isGoogleMaps = [[url absoluteString] rangeOfString:@"maps.google.com" options:NSCaseInsensitiveSearch];
NSRange isGoogleTerms = [[url absoluteString] rangeOfString:@"terms_maps.html" options:NSCaseInsensitiveSearch];

if(isGoogleMaps.location != NSNotFound || isGoogleTerms.location != NSNotFound ) {
        [[UIApplication sharedApplication] openURL:url];
       return NO;
}
else 
    return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
19

Attrapez simplement tous les liens dans votre javascript qui ont target="_blank" et passez-les à window.open avec le paramètre '_system'. Cela fonctionnera à la fois sur iOS et Android.

$(document).on('click', 'a[target="_blank"]', function(ev) {
  var url;

  ev.preventDefault();
  url = $(this).attr('href');
  window.open(url, '_system');
});
11
Ryan

C'est ce qui fonctionne pour moi d'après la réponse de @TDeBailleul. Fondamentalement, tout lien comportant un suffixe PDF, OR s'il s'agit d'une page spécifique que je souhaite ouvrir dans Safari, OR s'il ne s'agit pas d'une page de www.example.com lien externe), il s'ouvrira dans une nouvelle fenêtre: 

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

    // Open PDF files, Specific Pages, and External Links (not beginning with http://www.example.com) in Safari.app
    if (
        (navigationType == UIWebViewNavigationTypeLinkClicked) && 
        ([[[request URL] absoluteString] hasSuffix:@"pdf"] || [[[request URL] absoluteString] hasPrefix:@"http://www.example.com/specific-page.php"] || ![[[request URL] absoluteString] hasPrefix:@"http://www.example.com"])
        ) { 

        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    } 

    return YES;
}

J'espère que cela aide les autres!

9
adamdehaven

Vous pouvez (à partir de phonegap 1.5.0) utiliser:

<a href="some://external/url" target="_blank">Click Me</a>

Cela devrait amener phonegap à lancer le navigateur natif.

Je pense que user868766 faisait référence au fait que pour que ce qui précède fonctionne, il faut que l'URL externe soit sur la liste blanche. L’application sur laquelle je travaille a ouvert la source d’actualités dans le navigateur natif. Nous avons donc utilisé * la liste blanche pour nous assurer que nous n’écartions aucune source.

J'espère que cela pourra aider.

7
Dan

La bonne façon de faire est d'utiliser le plugin inAppBrowser

installez-le à l'aide de la CLI cordova:

cordova plugin add org.Apache.cordova.inappbrowser

Ensuite, pour ouvrir un lien sur le safari, utilisez simplement:

window.open('http://Apache.org', '_system');

Il existe une version plus récente du plugin hébergée sur npm 

pour l'installer à partir de la CLI cordova:

cordova plugin add cordova-plugin-inappbrowser

Pour ouvrir le site Web sur le safari, vous pouvez utiliser 

cordova.InAppBrowser.open('http://Apache.org', '_system');

ou, si vous souhaitez continuer à utiliser window.open comme l'ancienne version, vous pouvez simplement le faire sur l'événement prêt pour le périphérique

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    window.open = cordova.InAppBrowser.open;
}
6
jcesarmobile

Testé sur Cordova 2.4 + iOS

utilisez "_system" et pas besoin de mettre à jour la configuration

http://docs.phonegap.com/fr/2.3.0/cordova_inappbrowser_inappbrowser.md.html#InAppBrowser

target: la cible pour charger l'URL dans (String) (Facultatif, par défaut: "_self")

_self - s'ouvre dans Cordova WebView si l'URL est dans la liste blanche, sinon il s'ouvre dans InAppBrowser _blank - toujours ouvert dans InAppBrowser _system - toujours ouvert dans le navigateur Web du système

2
Alan124
  1. Ajoutez target = "_ blank" à vos liens. c'est à dire:

    <a href="http://www.brandonbrotsky.com/" target="_blank"></a>
    
  2. Assurez-vous que l'accès a une origine de * /> dans votre config.xml (assurez-vous qu'il s'agit bien de celui situé à la racine du répertoire de l'application, au-dessus du dossier www .

    <access Origin="*" />
    
  3. Ajoutez le code suivant à MainViewController.m

    - (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        NSURL *url = [request URL];
    
        // Intercept the external http requests and forward to Safari.app
        // Otherwise forward to the PhoneGap WebView
        if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) {
            [[UIApplication sharedApplication] openURL:url];
            return NO;
        }
        else {
            return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
        }
    } 
    

J'ai fait une vidéo rapide expliquant comment résoudre ce problème:

http://www.youtube.com/watch?v=zqbjXSnAR-Q&feature=c4-overview&list=UUefS6KLvFQVjhmL6hiBq4Sg

J'espère que ça aide!

0
Brandon J Brotsky

à l'intérieur du xcode

// Place le code dans /Classes/MainViewController.m 

    - (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)­navigationType
{ NSURL *url = [request URL]; 
// Intercept the external http requests and forward to Safari.app 
// Otherwise forward to the PhoneGap WebView 
if ([[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"]) { [[UIApplication sharedApplication] openURL:url]; return NO; } else { return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ]; }
}
0
Lobo

Cela fonctionne pour moi, ça aide beaucoup

-(void)viewDidLoad
{
   [super viewDidLoad];
    ////////////////////////
    NSString *urlAddress = @"http://www.playbuzz.org/";
    //NSURL *myURL = [NSURL URLWithString:urlAddress];
    myWebview.delegate = (id)self;
   [myWebview loadRequest:[NSURLRequest requestWithURL:[NSURL     URLWithString:urlAddress]]];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

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


    //  open External Links (not beginning with www.playbuzz.org/ in Safari.app
    if (
        (navigationType == UIWebViewNavigationTypeLinkClicked) &&
        ( ![[[request URL] absoluteString] hasPrefix:@"http://www.playbuzz.org/"])
        ) {

        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    }

   //open Internal links in uiwebview
   return YES;
}`
0
Cristiana Chavez

si vous voulez ouvrir une URL externe dans Safari, je pense que cela est utile:
C’est la solution% 100 garantie si vous utilisez phonegap - Testé sous ios6 .
pour ouvrir une URL externe dans un safari, procédez comme suit:

1-ajoutez votre lien dans l'hôte externe (liste blanche). par exemple http://google.com
Cordova.plist ou Phonegap.plist 2-in, remplacez "OpenAllWhitelistURLsInWebView" de "Oui" par "Non"
3-dans votre application, ajoutez (target = "_ blank") à votre lien
Exemple

    <a href="http://google.com" target="_blank">Google.com</a>


Je vous remercie.

0
Nasser Al-Hadhrami