我有一个Phonegap(cordova)应用程序,我想在phonegap WebView中加载一些外部网页,我还有其他外部网页,当用户激活它时我想在Safari中加载它们。
通常,大多数人都有他们想要在WebView中打开外部链接的问题。将 OpenAllWhitelistURLsInWebView 设置为 YES (在Cordova.plist / Phongap.plist中)解决了这个问题。
但我不想打开WebView的所有链接,只是一些。
我希望我可以在Safari中打开window.open('http://someexternalsite')
并在{4}}中打开它以在WebView中打开它。
知道怎么做吗?
答案 0 :(得分:19)
如果你想在safari中打开的链接都包含一个公共字符串,你可以使用下一段代码。
- (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中,至少对于cordova 2.2.0。
该方法最初是评论的。我不得不用它来重定向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];
答案 1 :(得分:11)
只需捕获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');
});
答案 2 :(得分:7)
你可以(从phonegap 1.5.0开始)使用:
<a href="some://external/url" target="_blank">Click Me</a>
这应该会导致phonegap启动本机浏览器。
我认为user868766指的是上述工作需要外部网址在白名单上。 我一直在努力的应用程序在本地浏览器中打开了新闻报道的来源,因此我们在白名单中使用*以确保我们不排除任何来源。
希望有所帮助。
答案 3 :(得分:6)
正确的方法是使用inAppBrowser plugin
使用cordova CLI安装它:
cordova plugin add org.apache.cordova.inappbrowser
然后,要在safari上打开一个链接,请使用:
window.open('http://apache.org', '_system');
npm
上托管了newer version of the plugin从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;
}
答案 4 :(得分:2)
在cordova 2.4 + iOS上测试
使用“_system”,无需更新任何配置
http://docs.phonegap.com/en/2.3.0/cordova_inappbrowser_inappbrowser.md.html#InAppBrowser
target:在(String)中加载URL的目标(可选,默认值: “_self”)
_self - 如果url在白名单中,则在Cordova WebView中打开,否则在InAppBrowser中打开 _blank - 始终在InAppBrowser中打开 _system - 始终在系统Web浏览器中打开
答案 5 :(得分:0)
如果你想在safari中打开一个外部网址,我认为这很有用:
如果您使用的是phonegap,则这是%100保证的解决方案 - 在ios6中测试。
在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>
谢谢。
答案 6 :(得分:0)
这对我来说很有帮助
-(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;
}`
答案 7 :(得分:0)
在您的链接中添加target =“_ blank”。 即:
<a href="http://www.brandonbrotsky.com/" target="_blank"></a>
确保访问权限的来源为* /&gt;在你的config.xml中(确保它在app目录的根目录中,位于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 ];
}
}
我制作了一个快速视频,解释了如何解决此问题:
http://www.youtube.com/watch?v=zqbjXSnAR-Q&feature=c4-overview&list=UUefS6KLvFQVjhmL6hiBq4Sg
希望它有所帮助!
答案 8 :(得分:0)
是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 ]; }
}