来自InAppBrowser executeScript的回调不在IOS上运行。的PhoneGap /科尔多瓦

时间:2014-12-17 11:27:03

标签: cordova phonegap-plugins cordova-plugins inappbrowser

我正在为我的Cordova应用程序开发Facebook登录功能,我在那里使用InAppBrowser来执行登录。从那里我尝试使用executeScript方法从InAppBroswer获取数据并将其返回到我的主应用程序(在服务器上运行,而不是在手机上本地运行)。这适用于Android,但不适用于IOS(没有调用任何回调方法)。也许这里的任何人都可以帮助我?

以下JavaScript文件包含在服务器上的主应用程序中..

对于IOS:

cordova.js (3.6.4)
cordova_plugins.js
index.js

对于Android

cordova.js (3.7.0)
cordova_plugins.js
index.js

在Android上运行代码时,我得到以下结果:

  • InAppBrowser打开
  • 我登录到脸书
  • 我重定向回到下面显示的页面(代码段2)
  • 我收到来自test()的警告 - InAppBrowser中的函数(代码片段编号2)
  • 我收到主应用中第一个回调函数的提醒(代码段号1)
  • 我收到主应用中第二个回调函数的提醒(代码段号1)
  • 我已登录(从以下代码中移除了代码段的结果)(代码段编号1)

当我在IOS上运行代码时,我得到了以下结果:

  • InAppBrowser打开
  • 我登录到脸书
  • 我重定向回到下面显示的页面(代码段2)
  • 我收到来自test()的警告 - InAppBrowser中的函数(代码片段编号2)

..但没有调用回调函数。所以" d"不断重复..

让事情变得更糟。代码也在IOS上工作了两次。但只有两次。没有我对它做任何改动。

[编辑]

它显示我的问题是由于InAppBrowser中的工作流程而发生的。 这是我目前的流程..

  • InAppBrowser luanches和page重定向到Facebook的登录api
  • 用户在Facebook上登录
  • 从facebook返回我的服务器,其中运行代码片段2
  • 所有回调都是在Android上触发的,但在IOS上没有(请参阅android / ios的工作流程abode)

当我尝试使用此流程时(无法使用登录功能),会触发回调..

  • 直接将InAppBrowser加载到代码段2中的代码
  • 所有浏览器都会触发所有回调

[/编辑]

我用来打开InAppBrowser并稍后从中收集数据的代码如下所示:

function facebookLoginApp() {
var fbloginwin = window.open("/p/ajax/facebookLoginRedirect","_blank",'');

fbloginwin.addEventListener('loadstart',function() {
    clearInterval(loop);
    var loop = setInterval(function() {
        fbloginwin.executeScript( {code: "test();"},function(values) { alert("returnvalue " + values); });

        fbloginwin.executeScript(
            {
                code: "localStorage.getItem('userid')"
            },
            function( values ) {
                var userid = values[ 0 ];
                alert("Loadstart userId: " + userid);
                //Some code removed here for more readable sample..
            }
        );
        fbloginwin.executeScript(
            {
                code: "localStorage.getItem('error')"
            },
            function( values ) {
                var error = values[ 0 ];

                // If a name was set, clear the interval and close the InAppBrowser.
                if ( error ) {
                    clearInterval( loop );
                    fbloginwin.close();
                    alert("Login failed: \n" +error);
                }
            }
        );
    },5000);
});

fbloginwin.addEventListener('loadstop',function() {
    clearInterval(loop);
    var loop = setInterval(function() {
        fbloginwin.executeScript(
            {
                code: "localStorage.getItem('userid')"
            },
            function( values ) {
                var userid = values[ 0 ];
                alert("Loadstop userid " + userid);
                //Some code removed here for more readable sample..
            }
        );
        fbloginwin.executeScript(
            {
                code: "localStorage.getItem('error')"
            },
            function( values ) {
                var error = values[ 0 ];

                // If a name was set, clear the interval and close the InAppBrowser.
                if ( error ) {
                    clearInterval( loop );
                    fbloginwin.close();
                    alert("Login failed: \n" +error);
                }
            }
        );
    },5000);
});
}

InAppBrowser中的代码如下所示:

<html>
<script>
    function test() {
        alert("12341234");
        return "12341234";
    }
    window.localStorage.setItem("userid","12341234");
    window.localStorage.setItem("error","");

    alert(window.localStorage.getItem("userid"));
</script>
<body>
    Login successful. You will be redirected shortly.
</body>
</html>

0 个答案:

没有答案