javascript - 如何在 Cordova 的 InAppBrowser 中优雅地中断加载某个 URL 并在系统浏览器中打开它?

标签 javascript cordova whatsapp inappbrowser

我正在使用 Cordova 的 inappbrowser 插件在我的应用程序中显示 Web 部件。在网站上,有共享链接,例如对于 WhatsApp:

<a href="whatsapp://send?text=Check this out">Share on WhatsApp</a>

现在,当在 inappbrowser 中单击这些链接时,它只是尝试加载 whatsapp://send?... 作为 URL 并显示错误页面。

我想做的是使用给定系统的浏览器/URI 处理程序打开以 whatsapp:// 开头的链接,因此它类似于在系统浏览器中单击此类链接时的行为。为此,我执行了以下操作:

urlChanged = function(event) {
    // when a "whatsapp://" link is clicked, open it in the system browser
    if(event.url.startsWith("whatsapp://")) {
        window.open(event.url, "_system");
        return;
    } 
}
// Add an "loadstart" event listener to the inappbrowser:    
browser.addEventListener("loadstart", urlChanged);

到目前为止,这有点管用,但有一些怪癖:

  1. 虽然当用户点击 WhatsApp 链接时事件会立即触发(通过触发警报进行检查),但系统浏览器实际打开需要大约两三秒的时间。
  2. 在等待这 2-3 秒并返回应用程序时,用户会看到一个 inappbrowser 错误页面,提示无法打开 whatsapp:// 链接(“未知 url 方案”)。

为了缓解第 2 点,我还在事件监听器中尝试了以下操作,但没有成功(行为完全相同):

urlChanged = function(event) {
    if(event.url.startsWith("whatsapp://")) {
        // stop loading the whatsapp:// link in inappbrowser
        browser.stop(); 
        // go back in history to display page where whatsapp:// link was on
        browser.history.back(); 
        window.open(event.url, "_system");
        return;
    } 
}
browser.addEventListener("loadstart", urlChanged);

你能指导我如何解决第 1 点和第 2 点吗?

最佳答案

所以我得到了以下代码:

openWithSystemBrowser = function(url) {
    window.open(url, "_system");
    location.href = "index.html";
};

shareOnWhatsapp = function(url) {
    openWithSystemBrowser(url);
};

/**
 * Handles URL changes in in-app browser, e.g. to handle logouts or
 * unsuccessful logins
 */
urlChanged = function(event) {
    if(event.url.startsWith("http://whatsapp://")) {
        shareOnWhatsapp(event.url.substr("http://".length));
        return;
    }
    if(event.url.startsWith("whatsapp://")) {
        shareOnWhatsapp(event.url);
        return;
    }
};

这当然有点蹩脚,因为您总是被带回 index.html,但就我的目的而言,这已经足够了。有兴趣看看是否有人找到了更优雅的解决方案。

它还解决了打开系统浏览器之前的 2-3 秒延迟问题,但坦率地说,我不知道为什么。

关于javascript - 如何在 Cordova 的 InAppBrowser 中优雅地中断加载某个 URL 并在系统浏览器中打开它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29982629/

相关文章:

javascript - 调用 child_added 监听器时返回自动生成的 ID

javascript - 找到所有标题标签并检查每个标签是否有 id 属性,如果没有则使用 jquery 添加 id 属性

javascript - 无法从图库/库中选择视频 -phonegap/cordova

javascript - Chrome 的安全性阻止我发送电子邮件,Android 也会阻止它吗?

whatsapp - 使用 WhatsApp Cloud API 发送 Commerce Manager 目录产品

javascript - 任何人都知道 CodeMirror 中的自动格式功能发生了什么?

javascript - HighCharts 中 X 轴的动态标签

ios - 自动释放中的 Worklight 6.2 和相机 iOS 错误

android - 在 whatsapp 上分享小图片会破坏图片

ios - 新号码的 Whatsapp 消息