【问题标题】:impossible to close inAppBrowser window无法关闭 inAppBrowser 窗口
【发布时间】:2014-08-08 09:03:05
【问题描述】:

我可以打开我的窗口,在里面做很多事情,例如通过 Linkedin 或 Facebook 登录。但我无法关闭它以返回我的应用程序。

1/ 当 url 包含特定关键字时,我尝试捕获事件以跟踪 url 并关闭窗口。但是该事件永远不会被触发。我从来没有任何警报。

    var ref = window.open(url, '_blank', 'location=no');

    ref.addEventListener('loadstart', function(event)
    {
        alert(event.url);
    });

    ref.addEventListener('loadstop', function(event) 
    {
        alert(event.url);
    });

2/ 所以我试图找到一种方法,每 n 秒从第一个窗口检查 ref.location.url。但是 ref.location.url 不存在。我看不到从父窗口访问 inapp 当前 url 的方法。

3/ 我想给 inapp 窗口起个名字。但是 inappbrowser 插件不允许为要打开的窗口命名。所以父窗口也不能这样检查子窗口的url。

4/ 我试图让子应用程序窗口关闭:cordova 不希望 javascript 关闭当前窗口。

 self.close();  => cannot
 window.close(); => cannot

5/ 我尝试恢复为 cordova.js 2.9.0-0-g83dc4bd ,但效果不佳。

所以,我可以在我的应用程序中打开一个弹出窗口并使用第三方 Oauth,但是我被困在这个弹出窗口中,无法返回我的应用程序。

我几乎检查了我在互联网上能找到的所有内容,但我现在完全不知道该怎么做。

我使用 cordova.js 3.5 Android build ,并使用

安装 inappbrowser
cordova plugin add org.apache.cordova.inappbrowser

一切都是标准的,cordova.js 已正确加载,我可以在日志中看到 InappBrowser 在我调用时正确使用。

  08-08 16:20:20.594: D/InAppBrowser(8496): target = _blank

Err... 帮助?

:)

【问题讨论】:

标签: cordova inappbrowser


【解决方案1】:

我可以找到解决这个问题的方法。这很奇怪而且有偏见。但正如我所见,我不是唯一一个,我在这里写下我的解决方案以及我可以解决该错误的方法。

首先,我添加了另一个监听器:

ref.addEventListener('exit', function(event) 
{
    if (debug) alert('exit');
});

然后,我使用了注入脚本功能,每 5 秒调用一次;

function  getStateSecondWindow()
{
    ref.executeScript(
        {code: "localStorage.getItem('loginOauth')"},
        function(data)
        {
            alert(data);
        }
    );
}

setInterval(getStateSecondWindow, 5000);

在那个阶段,我可以在日志中看到一些奇怪的东西:第一次调用 getStateSecondWindow 被阻止了。但随后 /everything/ 开始工作。我突然让我所有的事件监听器正常工作。就像我在某个地方遇到了堵塞,而 executeScript() 刚刚解除了所有阻塞。

此解决方案适用于我的 4 个项目。他们每个人的行为都是一样的。

万一事件再次出现问题,我使用双系统检查我的第二页并找到一种方法在适当的时候关闭它:在第二页中,我使用本地存储来设置我的var的值: localStorage.setItem("loginOauth", 'OK');

在我的第一页中,我使用执行脚本去读取本地存储:

function getStateSecondWindow() {
        ref.executeScript(
            {code: "localStorage.getItem('loginOauth')"},
            function(data)
            {
                if (data=='OK')
                {
                    //do what I need to do
                    ref.close();
                } 
            }
        );

有了这个系统,我不依赖(有时不)触发事件。即使 inappBrowser 窗口中的页面来自另一台服务器,它也可以工作:由于 javascript 在第二个窗口中被解释,我们位于创建原始 localStorage 的同一域中(没有交叉浏览问题)。

所以这就是我认为 inAppBroswer 不会触发事件并在需要时找到关闭第二个窗口的方法的方法。希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 2013-09-15
    • 2013-09-05
    相关资源
    最近更新 更多