如何在Safari中打开外部链接而不是应用程序的UIWebView?

我有一个Phonegap(cordova)应用程序,我想要在phonegap WebView中加载一些外部网页,我还有其他外部网页,当用户激活它们时,我想在Safari中加载它们。

通常,大多数人都有他们想要在WebView中打开外部链接的问题。 将OpenAllWhitelistURLsInWebView设置为YES (在Cordova.plist / Phongap.plist中)解决了这个问题。

但是我不想打开WebView的所有链接,只是一些。

我希望我可以调用window.open('http://someexternalsite')在Safari中打开, window.parent.location.href = 'http://mysite'在WebView中打开它。

任何想法如何做到这一点?

如果你想在safari中打开的链接都包含一个公共的string,你可以使用下一段代码。

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

放置在AppDelegate.m中的这段代码将打开在Safari中使用指定SCHEME的所有URL。

恐怕只有我能想出来。

希望这可以帮助

更新:

代码应该放在MainViewControler中,至less在cordova 2.2.0中。

该方法最初是评论。 我不得不使用它来redirect谷歌地图链接:

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

只要捕捉您的JavaScript中所有具有target="_blank" ,并使用“_system”参数将它们传递给window.open即可。 这将适用于iOS和Android。

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

根据@TDeBailleul的回答,这对我来说很有用。 基本上,任何具有PDF后缀的链接,或者如果它是我想要在Safari中打开的特定页面,或者如果它不是www.example.com/*(外部链接)中的页面,它将在新窗户:

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

希望这可以帮助别人!

你可以(如手机1.5.0)使用:

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

这应该导致电话启动本地浏览器。

我认为是什么user868766指的是,上述工作,你需要外部url在白名单。 我一直在使用的应用程序在本地浏览器中打开了新闻故事的来源,所以我们在白名单中使用*来确保我们没有排除任何来源。

希望有所帮助。

正确的做法是使用inAppBrowser插件

使用cordova CLI进行安装:

 cordova plugin add org.apache.cordova.inappbrowser 

然后,在safari上打开链接只需使用:

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

在npm上有一个更新版本的插件

从cordova CLI安装它:

 cordova plugin add cordova-plugin-inappbrowser 

要在Safari上打开网站,您可以使用

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

或者,如果你想继续使用window.open像旧版本,你可以在设备就绪事件上做到这一点:

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

在cordova 2.4 + iOS上testing

使用“_system”并且不需要更新任何configuration

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

target:加载URL的目标(String)(可选,默认:“_self”)

_self – 如果url位于白名单中,则在Cordova WebView中打开,否则将在InAppBrowser _blank中打开 – 始终在InAppBrowser _system中打开 – 始终在系统Web浏览器中打开

如果你想在safari中打开一个外部url,我认为这很有用:
如果您使用phonegap,这是%100保证解决scheme – 在ios6中testing。
在safari中打开外部url请执行以下操作:

1 – 将您的链接添加到外部主机(白名单)。 例如http://google.com
2-in Cordova.plist或Phonegap.plist,将“OpenAllWhitelistURLsInWebView”从“是”更改为“否”
3 – 在你的应用程序中添加(target =“_ blank”)到你的链接

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

谢谢。

这对我很有帮助

 -(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. 将target =“_ blank”添加到您的链接。 即:

     <a href="http://www.brandonbrotsky.com/" target="_blank"></a> 
  2. 确保在你的config.xml文件中访问的起源是* />(确保它位于应用程序目录的根目录中,位于www文件夹之上,例如:

     <access origin="*" /> 
  3. 将以下代码添加到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 ]; } } 

我做了一个快速video解释如何解决这个问题:

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

希望能帮助到你!

是Xcode

//将代码放置在/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 ]; } }