如何在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; }`
-
将target =“_ blank”添加到您的链接。 即:
<a href="http://www.brandonbrotsky.com/" target="_blank"></a>
-
确保在你的config.xml文件中访问的起源是* />(确保它位于应用程序目录的根目录中,位于www文件夹之上,例如:
<access origin="*" />
-
将以下代码添加到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 ]; } }
- 由cordova 3.4.1-0.1.0创build的xcode项目中的www文件夹不正确
- 使用cordova不改变自定义图标的应用程序图标
- Cordova通过WhatsApp从WebView内部点击进行分享
- UIWebView清除caching后应用程序退出&不caching图像脱机
- 通过configuration企业应用程序首选项(AirWatch)通过MDM检索用户名
- 从cordova html页面(cordova)加载保存在iOS App Documents目录中的图像?
- 存储和发送http cookie在PhoneGap应用程序中不起作用
- cordova调度任务
- Ionic iOS应用程序错误 – “WEB”客户端types不允许使用自定义schemeURI