Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PhoneGap: Opening external URL's in Safari

Tags:

cordova

I've just upgraded to PhoneGap 1.6.1 and I can no longer get external URL's to open in Safari.

Prior to this version I had patched AppDelegate.m as follows:

- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {     NSURL *url = [request URL];     if ([[url scheme] isEqualToString:@"http"]) {         [[UIApplication sharedApplication] openURL:url];         return NO;     } else {         return [self.viewController webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];     } } 

I notice that a similar question has been asked before: How can I open an external link in Safari not the app's UIWebView?

But it looks to me like this answer no longer works on version 1.6.1.

I've also tried setting OpenAllWhitelistURLsInWebView in Cordova.plist but neither setting gives me Safari.

Thanks in advance.

like image 572
user1228295 Avatar asked Apr 20 '12 11:04

user1228295


2 Answers

The best way to open links in a new URL is actually with window.open. Just set the target as "_system":

window.open("http://stackoverflow.com", "_system"); 

Before I found this in the docs, I actually wrote a plugin to do the same. I'm going to leave this answer here, because this would give you much more granular control over handling of links.

With PhoneGap 2.3+, I was unable to get URLs to open in Mobile Safari in any way. Using _blank didn't work, and I tried window.open(url, '_blank'), but this now opens the URL using the InAppBrowser plugin (which pretty much sucks). I thought it was interesting that that one used a plugin though, so I decided to write a plugin to open URLs using the standard method of opening URLs in iOS apps. You can see/grab the code on this gist here: https://gist.github.com/typeoneerror/5097118.

In my example, I wired up links that have a class called "_blank" with jQuery and opened those URLs with the plugin call:

// execute the plugin called OpenUrl, signature: // exec(successCallback, errorCallback, pluginName, pluginMethod, params) cordova.exec(success, error, "OpenUrl", "openUrl", [url]); 
like image 94
typeoneerror Avatar answered Oct 04 '22 05:10

typeoneerror


I have used this in the MainViewController.m

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {     NSURL *url = [request URL];     NSString *str = url.absoluteString;     NSRange range = [str rangeOfString:@"http://"];     //HACK to make url open in safari     if (range.location != NSNotFound) {         [[UIApplication sharedApplication] openURL:url];         return NO;     }     else {         return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];     } } 
like image 24
John Hornsby Avatar answered Oct 04 '22 04:10

John Hornsby