在Safari中打开外部链接(cordova)

14

我正在尝试在我的 Cordova 应用程序中打开一个外部 URL 链接。目前它使用模态视图呈现应用内浏览器,但是没有返回按钮或关闭按钮。用户在点击外部链接时实际上被卡住了。例如,当有人点击“访问网站”链接时,应用内浏览器会显示出来,网站也能正常显示,但没有方法可以回到应用程序,或者关闭应用内浏览器。我该如何解决这个问题?

<a href="http://www.sdtaproom.com/" target="_blank">Visit Website</a>

我看到有一个解决方案,window.open("http://stackoverflow.com", "_system");,但我不知道如何在href代码中实现它。

回答(已编辑):将此代码添加到 head 中的 script 标签中。

<script src="cordova.js"></script>
<script type="text/javascript">
window.addEventListener('load', function () {
  $(document).on('click', 'a[target="_system"],a[target="_blank"]', function (e) {
    e.preventDefault();
    var url = this.href;
    window.open(url,"_system");
  });
}, false);
</script>

你需要使用 JavaScript 来获取所有链接,然后选择 href 并在 window.open 函数中使用。 - jcesarmobile
请给出一个代码示例,谢谢。 - Josh O'Connor
4个回答

20

您可以在 href 属性中嵌入 JavaScript 代码。这应该可以解决问题:

<a href="javascript: window.open('http://www.sdtaproom.com/', '_system'); return false;">Visit Website</a>

您还需要安装InAppBrowser插件(不要被它的名称所迷惑)。


2
很遗憾 - 它在我们的一个应用程序中运行。我们还安装了InAppBrowser插件。(不要被它的名称所迷惑。)你可能想检查一下是否有所不同。 - Glorfindel
没起作用... 嗯,你使用的Cordova版本是什么? - Josh O'Connor
我正在使用3.5.0版本。 - Glorfindel
2
我解决了。安装了插件,将编辑后的问题中的代码添加到头部的脚本标签中,然后就可以工作了。谢谢。 - Josh O'Connor
@Glorfindel,我也发现需要添加InAppBrowser插件,你能更新一下你的答案吗? - andrewb
这在iOS 14上不再起作用了。@phemt.latd的解决方案对我有用。 - Aaron Mason

3
正如您在这里所看到的,所有混合上下文中的解决方案在iOS和cordova/phonegap的新版本中都不适用。
因此,我建议使用本地插件,请尝试使用以下插件:https://github.com/PaoloMessina/OpenUrlExt 该插件在Android中使用以下代码:
navigator.app.loadUrl(<my_url>, {openExternal : true});

以及适用于iOS的原生Objective-C解决方案:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:<my_url>]]; 

这个插件可以通过 Plugman 安装:

cordova plugin add https://github.com/PaoloMessina/OpenUrlExt

如Github README所述,这个工具非常简单易用。


使用Cordova 12解决了我的问题,谢谢。 - james-geldart

2
请注意,如果您使用config.xml中的allow-navigation指令将链接域名添加到白名单中,那么使用window.open(url, '_system')解决方案将不起作用(但您可能希望将某些链接用作导航链接,将其他一些链接用作外部链接)。
在这种情况下,您可以使用一些链接缩短服务,例如bit.ly,并将链接到该URL而不是原始URL。

0
遇到了 Cordova 11 的这个问题。我不知道它是否/如何与这个特定版本相关,但我的解决方案是,在没有使用 window.open 的情况下,仔细配置了两个config.xml设置:

所有应该在外部 Safari 中打开而不是替换 WebView 的链接,

  • 需要 allow-intent
  • 不能有 allow-navigation

在我的情况下,这是所有链接,所以:

<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<!-- NOT allow-navigation="http…*" -->

但我也需要Youtube的iframe嵌入,所以我添加了它

<allow-navigation href="https://www.youtube.com/embed/*" />

我花了一段时间才理解

  • intent ≈ 在外部应用程序中打开(包括Safari)
  • navigation ≈ 在WebView根或iframe中打开

(这可能不是100%正确。我主要是为未来的我写下这些笔记...)

这有助于我理解Cordova文档中的这个注释:

注意:`allow-navigation`优先于`allow-intent`。例如,允许导航到所有URL使用`<allow-navigation href="*" />`具有“捕获”所有意图的副作用,因此Webview导航到它们而不是触发外部应用程序等。


本质上与此问题的(接近?)重复问题的这个答案相同。 - kubi

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