Phonegap 2.9.0无法在默认浏览器中打开外部链接

5

我要做的事情非常简单,就是在设备浏览器中打开一个链接,但这比我想象的更难。

我创建了项目,并使用以下命令添加了iOS和Android平台:

$ phonegap create project_name
$ phonegap build ios
$ phonegap build android

我在config.xml文件中尝试了多种方式,包括添加“”,但均未生效。
在www/index.html文件中,我仅添加了链接,并包含了所有默认脚本(phonegap.js、js/index.js和app.initialize()的调用)。
我尝试了所有这些链接,它们都在webview中打开。
<a href="#" onclick="window.open('http://www.google.com', '_blank', 'location=yes');">_blank</a>
<a href="#" onclick="window.open('http://www.google.com', '_system', 'location=yes');">_system</a>
<a href="#" onclick="window.open('http://www.google.com', '_system');">_system</a>
<a href="http://www.google.com" target="_blank">target _blank</a>
<a href="http://www.google.com">no target</a>

请明确一下,我所做的所有测试都是在iOS模拟器和Android模拟器中进行的。

我已经搜索了很多内容,尝试了所有我找到的方法,但是都没有起作用。感谢任何帮助。

7个回答

11
为了使Cordova/PhoneGap应用程序中的链接在设备的默认浏览器中打开,您必须确保使用window.open(<url>, '_system'); 来访问它。为了使此功能正常工作 - 可能有点不符合直觉 - 您需要启用"InAppBrowser"插件。
在Cordova 2.9.0版本中,“InAppBrowser”插件已内置,您只需确保在Cordova的config.xml中未将其注释掉。从3.0.0版本开始,您需要通过从项目目录运行以下命令来安装插件:
cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git

以下是Cordova文档中关于‘InAppBrowser’如何使用window.open()的第二个参数target的重写实现:

target: 加载URL的目标,可选参数,默认为_self。(字符串

  • _self:如果URL在白名单中,则在Cordova WebView中打开,否则在InAppBrowser中打开。
  • _blank:在InAppBrowser中打开。
  • _system:在系统的Web浏览器中打开。

为了分离关注点并防止我忘记向每个要在默认浏览器中打开的<a/>添加onclick属性,我喜欢通过JavaScript动态附加该行为。以下是一个使用jQuery的示例,其中该行为也将在通过XHR重新加载相关HTML后重新附加。它只会附加到外部链接,从而还可以防止将其附加到mailto:链接上。

$('#idContentwrapper').on('click', '.colofon-text a', function(event) {
    var href = $(this).attr('href');
    if (typeof href !== 'undefined' &&
        href.substr(0, 7) === 'http://')
    {
        event.preventDefault();
        // Open in default browser App (on desktop: open in new window/tab)
        window.open(this.href, '_system', 'location=no');
    }
});

1
window.open(<url>, '_system'); 在最新版本的Phonegap中,只需添加'_system'即可。 - Ben Green
1
如果外部链接少于内部链接,则可以采用另一种动态方法:$('a[target=_system]').click(function(){...}) - Alastair
对于较新的PhoneGap版本,您不需要InAppBrowser插件。但请确保白名单已正确配置。例如,在config.xml中 <access origin="*"/> <plugin name="cordova-plugin-whitelist"/> <allow-intent href="http://*/*"/> 请参见https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/index.html。 - Tim Van Laer

3
我也遇到了这个问题。看起来大部分的回答都与问题完全相反,人们通常会回答如何在inAppBrowser中打开,我不知道为什么。
就像你一样,我尝试了各种方法,但没有一个有效。最终我不得不采取本地方式。幸运的是,在本地方式下只用了不到10分钟的时间,比尝试其他人的phonegap答案要短得多。
在Android中,
  1. add the line in onCreate method to bind object to webpage's window object.
  2. add a method on your binded object which accept a url string and behave open browser behavior.

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        super.appView.addJavascriptInterface(this, "nativeInterface");
    }
    
    public void openInDeviceBrowser(String url) {
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(i);
    }
    
在 HTML 中
<a href="#" onclick="window.nativeInterface.openInDeviceBrowser('http://www.google.com/')">Google</a>

iOS平台
1. 在MainViewController.h文件中添加委托(在我的项目中,它是这个名称)

@interface MainViewController : CDVViewController<UIWebViewDelegate>  

2. 将MainViewController设置为webView的代理,在- (void)webViewDidFinishLoad:(UIWebView*)theWebView{块中添加以下行:

    theWebView.delegate = self;  

3. 实现“- (BOOL)webView:shouldStartLoadWithRequest:navigationType:”方法:

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

最后,将你的html调用更改如下:
<a href="http://www.google.com/" onclick="window.nativeInterface.openInDeviceBrowser('http://www.google.com/')" target="_blank">Google</a></li>

就是这样了。对我来说比想象中容易,而且很有效。我认为这可以避免将来再次更改phonegap api。

希望这对您也有用。


2

虽然可能不能完全回答你的问题,但或许能帮到别人。

navigator.app.loadUrl('https://google.com/', { openExternal:true });

Cordova 3.3.1


2

我不确定这是否仍然相关,但是为了给出我的意见:我刚刚对我的Cordova 3.3(而非PhoneGap Build)应用进行了一些重新配置,并遇到了同样的问题。你不需要这个插件-确保你链接的是:

<a href="#" onclick="window.open('http://www.google.com', '_system');">_system</a>

...在您的项目/xml/config.xml中发布并且很重要。

<access origin="http://127.0.0.1*"/>

我也禁用了应用内浏览器:

<!--
 <feature name="InAppBrowser">
  <param name="android-package" value="org.apache.cordova.InAppBrowser"/>
</feature>    
--> 

现在它又正常工作了 ;)


0
在iOS中(至少在PhoneGap 2.9中),这个可以工作。
<a href="http://www.google.com" onclick="window.open(this.href,'_system'); return false;">Open</a>

0
我曾经在尝试在Android上使用PhoneGap的inappbrowser时遇到了困难,但是从来没有成功过。因此,我利用了Android的本机功能(系统浏览器和设备的返回按钮)。我在config.xml文件中注释掉以下内容<access origin="*" />,并只是在链接中添加了rel="external"

这个方法很好用,在设备的浏览器中打开链接,而且设备的返回按钮可以直接回到用户所在的同一个应用程序位置。无论设备是否连接到网络,系统都可以处理。

我的iOS版本应用程序可以很好地使用inappbrowser。


-2
如果您想连接到外部链接,请使用rel属性。例如:<a rel="external" href="">,一切都会正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接