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

fjc*_*fjc 7 javascript cordova whatsapp inappbrowser

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

<a href="whatsapp://send?text=Check this out">Share on WhatsApp</a>
Run Code Online (Sandbox Code Playgroud)

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

我想要做的是开放链接,首先whatsapp://使用给定系统的浏览器/ URI处理程序,因此它类似于在系统浏览器中单击此类链接时的行为.为此,我做了以下事情:

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);
Run Code Online (Sandbox Code Playgroud)

到目前为止,这有点奏效,但有些怪癖:

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

为了缓解第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);
Run Code Online (Sandbox Code Playgroud)

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

fjc*_*fjc 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

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