Come posso aprire un collegamento esterno in Safari e non l’UIWebView dell’app?

Ho un’applicazione Phonegap (cordova) in cui voglio caricare alcune pagine Web esterne all’interno di Web View di phonegap e ho altre pagine Web esterne che voglio caricare in Safari quando l’utente le triggers.

In genere la maggior parte delle persone ha il problema di voler aprire un collegamento esterno in WebView. L’impostazione di OpenAllWhitelistURLsInWebView su YES (in Cordova.plist / Phongap.plist) risolve il problema.

Ma non voglio aprire tutti i collegamenti di WebView, solo alcuni.

Speravo di poter chiamare window.open('http://someexternalsite') per aprire in Safari e window.parent.location.href = 'http://mysite' per aprirlo in WebView.

Qualche idea su come fare questo?

Se i collegamenti che vuoi aprire in Safari contengono tutti una stringa comune, puoi usare il prossimo pezzo di codice.

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

Questo codice inserito in AppDelegate.m aprirà tutti gli URL che utilizzano lo SCHEME specificato in Safari.

Ho paura che sia tutto quello che potrei inventare.

Spero che questo ti aiuti

AGGIORNARE :

Il codice deve essere inserito in MainViewControler, almeno per Cordova 2.2.0.

Il metodo è inizialmente commentato. Ho dovuto usarlo per redirect i collegamenti delle mappe di Google:

 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]; 

Prendi tutti i link nel tuo javascript che hanno target="_blank" e passali a window.open con il parametro “_system”. Funzionerà su iOS e Android.

 $(document).on('click', 'a[target="_blank"]', function(ev) { var url; ev.preventDefault(); url = $(this).attr('href'); window.open(url, '_system'); }); 

Questo è ciò che funziona per me sulla base della risposta di @TDeBailleul. In pratica, qualsiasi link che abbia un suffisso di PDF, OPPURE se si tratta di una pagina specifica che voglio aprire in Safari, OPPURE se non è una pagina all’interno di http://www.example.com/* (un link esterno) si aprirà in un nuova finestra:

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

Spero che questo aiuti gli altri!

È ansible (a partire da PhoneGap 1.5.0) utilizzare:

 Click Me 

Ciò dovrebbe indurre PhoneGap ad avviare il browser nativo.

Penso a ciò che user868766 si riferiva al fatto che per il funzionamento di cui sopra hai bisogno che l’URL esterno sia nella whitelist. L’app su cui ho lavorato ha aperto la fonte delle notizie nel browser nativo, quindi abbiamo usato * nella whitelist per assicurarci di non escludere alcuna fonte.

Spero possa aiutare.

Il modo giusto per farlo è usare il plugin inAppBrowser

installarlo utilizzando la CLI cordova:

 cordova plugin add org.apache.cordova.inappbrowser 

Quindi, per aprire un collegamento su Safari, usa semplicemente:

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

C’è una versione più recente del plugin ospitato su npm

per installarlo dalla CLI cordova:

 cordova plugin add cordova-plugin-inappbrowser 

Per aprire il sito Web su Safari puoi utilizzare

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

oppure, se vuoi continuare a utilizzare window.open come la versione precedente, puoi farlo solo su evento pronto per il dispositivo:

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

Testato su cordova 2.4 + iOS

utilizzare “_sistema” e non è necessario aggiornare alcuna configurazione

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

target: la destinazione per caricare l’URL in (String) (Opzionale, Predefinito: “_self”)

_self – si apre in Cordova WebView se url è nella white-list, altrimenti si apre in InAppBrowser _blank – sempre aperto in InAppBrowser _system – sempre aperto nel browser di sistema

se vuoi aprire un URL esterno in Safari, penso che questo sia utile:
Questa è la soluzione% 100 garantita se si utilizza phonegap – Testato in ios6.
per aprire l’url esterno nel safari, procedi come segue:

1-aggiungi il tuo link in Host esterno (lista bianca). ad es. http://google.com
2-in Cordova.plist o Phonegap.plist, cambia “OpenAllWhitelistURLsInWebView” da “Sì” a “No”
3-nella tua applicazione aggiungi (target = “_ blank”) al tuo link
esempio

  Google.com 

Grazie.

Questo funziona per me aiuta molto

 -(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; }` 
  1. Aggiungi target = “_ blank” ai tuoi link. vale a dire:

      
  2. Assicurati che l’accesso abbia un’origine di * /> nel tuo config.xml (assicurati che sia quello nella root della directory app, sopra la cartella www.

      
  3. Aggiungere il seguente codice a 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 ]; } } 

Ho fatto un breve video che spiega come risolvere questo problema:

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

Spero che sia d’aiuto!

iside xcode

// Inserisci il codice in /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 ]; } }