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

ngCordova InAppBrowser plugin freeze app on iOS but no on Android

我目前在 IOS 和 Android.

上使用 IONIC v1.0.0,AngularJs 和 ngCordova v0.1.23-alpha

我遇到了登录视图冻结的问题。 它发生在打开 InAppBrowser 并点击 "back to app"(用于 IOS 返回的关闭按钮标题)后,我的登录视图冻结,禁用了触摸整个屏幕的能力,使我无法登录。仅当我在启动应用程序时调用 InAppBrowser 时才会发生,如果我在应用程序生命周期中(登录后)使用它,它不会这样做。

这是我的一些代码片段

在app.js中:

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

在主控制器中我有工厂:


.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) {

            });

        }
    }
})

如果有人遇到此类问题,请告诉我如何解决。任何问题或澄清让我知道。提前致谢。

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

THREAD WARNING: ['InAppBrowser'] took '108.12' ms. Plugin should use a background thread


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

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

2- 将 openBrowser 函数调用(在我的例子中)包装在 setTimeout 中。这将延迟调用,直到线程完成并且 UI 不会被阻塞。完成后(在我的例子中)它打开了 inAppBrowser,当我点击 "Back to app" UI 时根本没有被阻止。

希望这对那里的人有所帮助。