ngCordova InAppBrowser插件在iOS上冻结应用程序但在Android上没有

时间:2016-05-19 20:26:40

标签: ios angularjs ionic-framework ngcordova

我目前在IOS和Android上使用IONIC v1.0.0,AngularJs和ngCordova v0.1.23-alpha。

我遇到了登录视图冻结的问题。 它在打开InAppBrowser并点击“返回应用程序”(用于IOS的关闭按钮标题返回)后会冻结我的登录视图,从而无法触摸整个屏幕并使我无法登录。只有当我在启动应用程序时调用InAppBrowser时才会发生这种情况,如果我在应用程序生命周期中使用它(登录后),它就不会这样做。

以下是我的一些代码

在app.js中:

angular.module('MyApp', ['ionic', 'MyApp', 'ngCordova', 'mainController', 'loginController', 'pascalprecht.translate', 'ngStorage', 'ngSanitize', 'ngAnimate', 'ngTouch', 'ngCookies', 'ngLocale', 'testController'])

在mainController中我有工厂:


.factory('customMainFunction', function ($rootScope, $ionicLoading, $ionicScrollDelegate, $ionicPopup,
    $timeout, $localStorage, $location, $ionicHistory, $window, $cordovaInAppBrowser) {

    var Token = "";

    return {

 openBrowser: function (link) {

            var options = {
                location: 'yes',
                clearcache: 'yes',
                toolbar: 'yes',
                closebuttoncaption: 'Back to App'
            };

            document.addEventListener("deviceready", function () {
                $cordovaInAppBrowser.open(link, '_blank', options)
                    .then(function (event) {
                        // success
                    })
                    .catch(function (event) {
                        // error
                    });

            }, false);


            $rootScope.$on('$cordovaInAppBrowser:loadstart', function (e, event) {

                //console.log(event);
                var url = "";
                var positionNumber;
                var res;

                url = event.url;                
                positionNumber = url.search("ssoToken=");                               
                res = url.substr(Number(positionNumber)+9);

                /*positionNumber = url.search("module=");                    
                res = url.substr(Number(positionNumber)+6);*/

                if(url !== "" && positionNumber >= 0 && res.length > 0) {

                    $rootScope.$broadcast('ssoToken', { token: res });               
                    $cordovaInAppBrowser.close();
                }

            });

            $rootScope.$on('$cordovaInAppBrowser:loadstop', function (e, event) {
                console.log("loadstop");
                //console.log(event);

                // insert CSS via code / file
                //$cordovaInAppBrowser.insertCSS({
                //    code: ''
                //});

                // insert Javascript via code / file
                //$cordovaInAppBrowser.executeScript({
                 //   file: ''
                //});
            });

            $rootScope.$on('$cordovaInAppBrowser:loaderror', function (e, event) {

            });

            $rootScope.$on('$cordovaInAppBrowser:exit', function (e, event) {

            });

        }
    }
})

如果有人遇到此类问题,请告诉我可以采取哪些措施来解决问题。任何问题或澄清让我知道。提前谢谢。

1 个答案:

答案 0 :(得分:0)

发现了我自己的问题。基本上这个问题与线程有关。 Look for Threading。我是怎么知道的?在XCode上,我能够看到一条消息:

  

线程警告:['InAppBrowser']花了'108.12'ms。插件应该使用   后台线程


有两种方法可以解决这个问题(我相信):

1-使用背景线程(就像消息状态一样)。请参阅: How to run cordova plugins in the background?

2-在setTimeout中包装openBrowser函数调用(在我的例子中)。这将延迟调用,直到线程完成并且UI不会被阻止。完成后(在我的情况下)它打开了inAppBrowser,当我点击“返回应用程序”时,UI根本就没有阻止。

希望这可以帮助那些人。