PhoneGap Build: 如何在Android设备上使用浏览器打开外部URL?

19

在我的PhoneGap Android应用中,外部URL无法在系统浏览器中打开。我正在使用PhoneGap Build 2.3.0。

根据Cordova文档,我使用了目标'_system':

window.open('http://www.myurl.nl', '_system');

我的 config.xml 文件中有:

<plugin name="InAppBrowser" value="org.apache.cordova.InAppBrowser" />
<access origin="*" browserOnly="true" />

但链接仍在我的应用程序Web视图中打开。

如何解决这个问题?


在Android上,它似乎默认可以正常工作(但我也使用Crosswalk插件...)。请查看我的2015年回答,以在WebView中打开“_self”,并在外部浏览器中打开“_blank”:https://dev59.com/71wY5IYBdhLWcg3wyqWH#32227524 - Sebastien Lorber
6个回答

15

当你想继续使用PhoneGap Build时,这并不是一个解决方案,但我通过在本地设置Cordova(PhoneGap)的开发环境并编译应用程序来解决了问题。 在Cordova 2.5.0中,window.open('http://www.myurl.nl', '_system');工作得非常完美,它将在系统浏览器中打开链接。

因此,我的建议是停止使用PhoneGap Build,并开始本地编译您的应用程序。以下是如何设置Cordova开发环境的指南 >>


你能解释一下本地编译和PhoneGap构建之间的区别吗? - realtebo
1
主要的区别在于设置上。当你本地编译时,更容易改变某些设置。但是因为Cordova 2.5在PhoneGap Build上所产生的结果与本地安装的结果不同,所以核心代码肯定有所差异,但我不知道原因。 - Joan
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Sebastien Lorber

14

回答有点晚,但可能对某些人有帮助。

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

Cordova 3.3.1


这对我来说很有Bug,我的应用程序会加载多个选项卡,即使链接只单击一次! - Ian Jamieson
我也是,最终我使用了Hammer JS来监听轻触事件,这样可以防止链接被多次打开。 - Ian Jamieson
在安卓上对我来说有些bug。链接在浏览器中打开,但接着应用程序又回到了焦点。 - Keith

7
这个问题有点老了,但我认为值得更新一下。在使用2.9.0版本的情况下,PhoneGap Build可以很好地解决这个问题。 我已经在Android 4.3和iOS 6.1.3上进行了编译和测试。 我的应用程序中没有InAppBrowser插件,因为它是用来在应用程序中打开页面而不是导致本机浏览器打开它们的,并且我只有以下关于访问标签的内容:
<access origin="http://127.0.0.1*"/>
<access origin="http://phonegap.com" subdomains="true" />

使用PhoneGap 3.0,可以通过Android CLI构建。 - Rahmathullah M

7
这对我很有帮助。Phonegap 3.1.0。 HTML代码:
<a id="ext-link" href="#">Google it</a>

或者

<button id="ext-link" href="#">Google it</button>

Javascript(使用jQuery+cordova):

$("#ext-link").on("click"), function() {
    if (typeof navigator !== "undefined" && navigator.app) {
        // Mobile device.
        navigator.app.loadUrl('http://www.google.com/', {openExternal: true});
    } else {
        // Possible web browser
        window.open("http://www.google.com/", "_blank");
    }
});

希望能对您有所帮助。

1
没有帮助我。04-11 11:47:48.186: E/Web控制台(22063): 未捕获的类型错误:无法调用未定义的“loadUrl”方法:88 - Dimitri

1

@George Siggouroglou: 在文档中多次出现的元素不应使用id,而应该将代码更加模块化。如果希望支持触摸设备,最好在“click”之前使用“tap”,因为它比点击事件更快速和更早地触发。我喜欢使用modernizr来检查触摸功能,因为它使特性检测变得轻松。

jQuery Mobile的tap事件会在单个目标对象上发生快速、完整的触摸事件后触发。它是标准点击事件的手势等效物,由触摸手势的释放状态触发。 https://api.jquerymobile.com/tap/

希望这能帮助到某些人。

**html code:**

<a class="ext-link" href="#">Google it</a>

or

<button class="ext-link" href="#">Google it</button>

JavaScript(带有jQuery):
//define tap or click event type on root level (can be combined with modernizr)
iaEvent = "click";
if (typeof navigator !== "undefined" && navigator.app) {
   iaEvent = "tap";
}
$('.ext-link').each.bind(iaEvent, function() {
    if (typeof navigator !== "undefined" && navigator.app) {
        // Mobile device.
        var linktarget = this.attr("href");
        navigator.app.loadUrl(linktarget, {openExternal: true});
    } else {
        // Possible web browser
        window.open(linktarget, "_blank");
    }
});

-1
请使用以下代码:

window.open('http://www.myurl.nl', '_blank', 'location=yes');


你为什么要投票反对这条评论? 如果你在PhoneGap网站上查看,这个命令行是InAppBrowser安装指南的复制粘贴... https://github.com/apache/cordova-plugin-inappbrowser/blob/dev/doc/index.md你的个人资料也应该被投票否决。 - Dimitri
你应该提到你的解决方案需要InAppBrowser插件才能工作,否则它将无法正常运行。 - Tom McKenzie
谢谢提示'location=yes'。我在其他地方看到它是=no,但我无法让它工作。 - Alen Giliana
答案是相反的... 显式传递_blank指令告诉Cordova不要在系统浏览器中打开它! - gregtzar

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