无法关闭inAppBrowser窗口

时间:2014-08-08 09:03:06

标签: cordova inappbrowser

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

1 /我试图抓住事件来跟踪网址,并在网址包含特定关键字时关闭窗口。但事件永远不会被解雇。我从来没有任何警觉。

    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版本,我用

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

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

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

错误......帮忙?

:)

1 个答案:

答案 0 :(得分:3)

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

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

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被阻止了。但是/ / / /开始起作用了。我突然让所有的事件监听器都正常工作。就好像我在某个地方有一个果酱,而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不会触发事件并找到在需要时关闭第二个窗口的方法。希望它有所帮助:)