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 时根本没有被阻止。
希望这对那里的人有所帮助。
我目前在 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 时根本没有被阻止。
希望这对那里的人有所帮助。