Android Ionic页面转换不适用于具有推送功能的页面

Android Ionic页面转换不适用于具有推送功能的页面,android,angularjs,cordova,ionic-framework,phonegap-pushplugin,Android,Angularjs,Cordova,Ionic Framework,Phonegap Pushplugin,我在我的应用程序中实现了android推送接收,只要应用程序在该页面启动,它就可以正常工作。但是,如果您导航到收件箱页面,其中实现了推送通知,则转换将不起作用 在没有push实现的情况下,转换运行良好 我想知道是否有人在实现特性时遇到过类似的问题 .controller('BuzonMenuCtrl', function($scope, $window, $state, $ionicPlatform) { $scope.botonBuzon = function(){ $state.

我在我的应用程序中实现了android推送接收,只要应用程序在该页面启动,它就可以正常工作。但是,如果您导航到收件箱页面,其中实现了推送通知,则转换将不起作用

在没有push实现的情况下,转换运行良好

我想知道是否有人在实现特性时遇到过类似的问题

.controller('BuzonMenuCtrl', function($scope, $window, $state, $ionicPlatform) {
  $scope.botonBuzon = function(){
    $state.go('buzon');
  };
})

.controller('BuzonCtrl', function($scope, $rootScope, $window, $ionicActionSheet, $ionicPopup, $state, $http, dataFactory, pushFactory) {

  // Activacion de la funcionalidad push
  pushFactory.funcionalidadPush();

}
factorys.js

.factory('pushFactory', ['$rootScope','$http','$state','$ionicLoading','$ionicPlatform','$cordovaPush','dataFactory',
                          function($rootScope,$http,$state,$ionicLoading,$ionicPlatform,$cordovaPush,dataFactory) {

  /* Objeto del factory */
  var fac = {};

  fac.funcionalidadPush = function(){
    if (ionic.Platform.isAndroid()){
      var androidConfig = {
        "senderID": "94XXXXXXXXXX",
        "ecb": "casosPush"
      };

      $rootScope.data.pushplatform = "gcm";
      alert('Entro en modo Android');

    };

    if (ionic.Platform.isIOS()){
      alert('Entro en modo iOS');
    };

    $ionicPlatform.ready(function() {
      $cordovaPush.register(androidConfig).then(function(result) {
        // Success
      }, function(err) {
        // Error
      })

      window.casosPush = function (notification) {
        switch(notification.event) {
          case 'registered':
            if (notification.regid.length > 0 ) {
              alert('registration ID = ' + notification.regid);
              $rootScope.data.token = notification.regid;

            }
            break;

          case 'message':
            // this is the actual push notification. its format depends on the data model from the push server
            //alert('message = ' + notification.message + ' msgCount = ' + notification.msgcnt);
            $rootScope.mensajes.push(notification);
            break;

          case 'error':
            alert('GCM error = ' + notification.msg);
            break;

          default:
            alert('An unknown GCM event has occurred');
            break;
        }
      };

      // WARNING: dangerous to unregister (results in loss of tokenID)
      $cordovaPush.unregister(options).then(function(result) {
        // Success!
      }, function(err) {
              // Error
      })

    }, false);
  };


  return fac;

}]);
App.js

angular.module('notPush', ['ionic', 'ngCordova', 'notPush.controllers'])

.run(function($ionicPlatform) {
  $ionicPlatform.ready(function() {
    if(window.cordova && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
    }
    if(window.StatusBar) {
      StatusBar.styleDefault();
    }
  });
})

.config(function($stateProvider, $urlRouterProvider) {

  $stateProvider

  .state('splash', {
    url: '/splash',
    templateUrl: 'templates/splash.html',
    controller: 'SplashCtrl'
  })

  .state('buzonMenu', {
    url: '/buzonMenu',
    templateUrl: 'templates/buzonMenu.html',
    controller: 'BuzonMenuCtrl'
  })

  .state('buzon', {
    url: '/buzon',
    templateUrl: 'templates/buzon.html',
    controller: 'BuzonCtrl'
  })

  // If none of the above states are matched, use this as the fallback:
  $urlRouterProvider.otherwise('/buzonMenu');

});
编辑

正如我在评论中所建议的那样

$window.location.reload(true);
它除了让屏幕闪烁之外什么都不做,而且

$state.go($state.current, {}, {reload: true});
它试图重新加载页面,但仅在损坏状态下加载,加载白色背景和按钮(不带颜色),但不加载其他内容

编辑2一些澄清:

  • 推送通知的代码写在buzon_页面控制器中,这是有问题的页面
  • 当我说“转换不起作用”时,我的意思是页面不会加载,但该页面的所有警报仍会被触发,推送令牌仍会被检索。是一个视觉问题,视图无法加载
  • 该问题与HTTP调用无关,因为它们当前已被注释
  • 编辑3

    我将通知代码移到了一个工厂,而不是放在控制器中(我想应该是这样),但是没有任何改进

    我在发布期间添加了adb logcat的结果。有两件事引起了我的注意:

  • 它在factorys.js上显示了一个“ReferenceError:options未定义”
  • 它显示了一些OpenGLRenderer问题

    1219             AudioTrack  W  AUDIO_OUTPUT_FLAG_FAST denied by client   
    2531             PushPlugin  V  execute: action=register
    2531             PushPlugin  V  execute: data=[{"senderID":ID DELETED FOR PRIVACY ISSUES,"ecb":"casosPush"}]
    2531             PushPlugin  V  execute: jo={"senderID":ID DELETED FOR PRIVACY ISSUES,"ecb":"casosPush"}
    2531             PushPlugin  V  execute: ECB=casosPush senderID=ID DELETED FOR PRIVACY ISSUES
    2531           GCMRegistrar  D  resetting backoff for ID DELETED FOR PRIVACY ISSUES
    1219   InputMethodManager..  W  Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@df31fbd attribute=null, token = a
                                   ndroid.os.BinderProxy@28f2dc02
    2531           GCMRegistrar  V  Registering app ID DELETED FOR PRIVACY ISSUES of senders ID DELETED FOR PRIVACY ISSUES
    2531   SystemWebChromeCli..  D  file:///android_asset/www/lib/ionic/js/ionic.bundle.js: Line 20243 : ReferenceError: options is not defined
    2531   SystemWebChromeCli..  D  at file:///android_asset/www/js/factorys.js:214:31
    2531   SystemWebChromeCli..  D  at file:///android_asset/www/lib/ionic/js/ionic.bundle.js:44687:19
    2531   SystemWebChromeCli..  D  at Object.ionic.Platform.ready (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:2120:9)
    2531   SystemWebChromeCli..  D  at Object.self.ready (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:44685:26)
    2531   SystemWebChromeCli..  D  at Object.fac.funcionalidadPush (file:///android_asset/www/js/factorys.js:166:20)
    2531   SystemWebChromeCli..  D  at new <anonymous> (file:///android_asset/www/js/controllers.js:440:15)
    2531   SystemWebChromeCli..  D  at invoke (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:12821:17)
    2531   SystemWebChromeCli..  D  at Object.instantiate (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:12829:27)
    2531   SystemWebChromeCli..  D  at file:///android_asset/www/lib/ionic/js/ionic.bundle.js:17098:28
    2531   SystemWebChromeCli..  D  at self.appendViewElement (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:48110:24)
    2531               chromium  I  [INFO:CONSOLE(20243)] "ReferenceError: options is not defined
    2531               chromium  I  at file:///android_asset/www/js/factorys.js:214:31
    2531               chromium  I  at file:///android_asset/www/lib/ionic/js/ionic.bundle.js:44687:19
    2531               chromium  I  at Object.ionic.Platform.ready (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:2120:9)
    2531               chromium  I  at Object.self.ready (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:44685:26)
    2531               chromium  I  at Object.fac.funcionalidadPush (file:///android_asset/www/js/factorys.js:166:20)
    2531               chromium  I  at new <anonymous> (file:///android_asset/www/js/controllers.js:440:15)
    2531               chromium  I  at invoke (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:12821:17)
    2531               chromium  I  at Object.instantiate (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:12829:27)
    2531               chromium  I  at file:///android_asset/www/lib/ionic/js/ionic.bundle.js:17098:28
    2531               chromium  I  at self.appendViewElement (file:///android_asset/www/lib/ionic/js/ionic.bundle.js:48110:24)", source: file:///android_asset/www/lib/ionic
                                   /js/ionic.bundle.js (20243)
    1604                    GCM  D  GcmService start Intent { act=com.google.android.c2dm.intent.REGISTER pkg=com.google.android.gms cmp=com.google.android.gms/.gcm.GcmServi
                                   ce (has extras) } com.google.android.c2dm.intent.REGISTER
    2531   GCMBroadcastReceiver  V  onReceive: com.google.android.c2dm.intent.REGISTRATION
    2531           GCMRegistrar  V  Setting the name of retry receiver class to com.plugin.gcm.CordovaGCMBroadcastReceiver
    2531   GCMBroadcastReceiver  V  GCM IntentService class: com.plugin.gcm.GCMIntentService
    2531   GCMBaseIntentService  V  Acquiring wakelock
    2531   GCMBaseIntentService  V  Intent service name: GCMIntentService-GCMIntentService-1
    2531           GCMRegistrar  V  Registering receiver
    2531   GCMBaseIntentService  D  handleRegistration: registrationId = TOKEN DELETED FOR PRIVACY ISSUES, error = null, unregistered = null
    2531           GCMRegistrar  D  resetting backoff for ID DELETED FOR PRIVACY ISSUES
    2531           GCMRegistrar  V  Saving regId on app version 10
    2531       GCMIntentService  V  onRegistered: TOKEN DELETED FOR PRIVACY ISSUES
    2531       GCMIntentService  V  onRegistered: {"event":"registered","regid":TOKEN DELETED FOR PRIVACY ISSUES}
    2531             PushPlugin  V  sendJavascript: javascript:casosPush({"event":"registered","regid":TOKEN DELETED FOR PRIVACY ISSUES})
    2531   GCMBaseIntentService  V  Releasing wakelock
    2531          EGL_emulation  W  eglSurfaceAttrib not implemented
    2531         OpenGLRenderer  W  Failed to set EGL_SWAP_BEHAVIOR on surface 0xa4cdd7e0, error=EGL_SUCCESS
    1219             AudioTrack  W  AUDIO_OUTPUT_FLAG_FAST denied by client
    1219   InputMethodManager..  W  Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@35215d0a attribute=null, token = 
                                   android.os.BinderProxy@28f2dc02
    
    1219带音频输出标志的音频曲目被客户端快速拒绝
    2531 PushPlugin V execute:action=寄存器
    2531 PushPlugin V execute:data=[{“senderID”:因隐私问题而删除的ID,“ecb”:“casosPush”}]
    2531 PushPlugin V execute:jo={“senderID”:ID因隐私问题被删除,“ecb”:“casosPush”}
    2531 PushPlugin V execute:ECB=casosPush senderID=ID因隐私问题被删除
    2531 GCMRegistrar D为因隐私问题删除的ID重置回退
    1219输入方法管理器。。W窗口已聚焦,忽略焦点增益:com.android.internal.view.IInputMethodClient$Stub$Proxy@df31fbdattribute=null,token=a
    ndroid.os。BinderProxy@28f2dc02
    2531 GCMRegistar V因发件人隐私问题删除注册应用程序ID因隐私问题删除ID
    2531 SystemWebChromeCli。。Dfile:///android_asset/www/lib/ionic/js/ionic.bundle.js: 第20243行:引用错误:未定义选项
    2531 SystemWebChromeCli。。盯着file:///android_asset/www/js/factorys.js:214:31
    2531 SystemWebChromeCli。。盯着file:///android_asset/www/lib/ionic/js/ionic.bundle.js:44687:19
    2531 SystemWebChromeCli。。D位于Object.ionic.Platform.ready(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:2120:9)
    2531 SystemWebChromeCli。。D在Object.self.ready(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:44685:26)
    2531 SystemWebChromeCli。。D位于Object.fac.functionalidadpush(file:///android_asset/www/js/factorys.js:166:20)
    2531 SystemWebChromeCli。。D在纽约(file:///android_asset/www/js/controllers.js:440:15)
    2531 SystemWebChromeCli。。D在调用时(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:12821:17)
    2531 SystemWebChromeCli。。D在Object.instantiate(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:12829:27)
    2531 SystemWebChromeCli。。盯着file:///android_asset/www/lib/ionic/js/ionic.bundle.js:17098:28
    2531 SystemWebChromeCli。。D在self.appendViewElement处(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:48110:24)
    2531铬I[信息:控制台(20243)]“参考错误:未定义选项
    2531铬I atfile:///android_asset/www/js/factorys.js:214:31
    2531铬I atfile:///android_asset/www/lib/ionic/js/ionic.bundle.js:44687:19
    2531铬I在Object.ionic.Platform.ready处(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:2120:9)
    2531铬I在Object.self.ready(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:44685:26)
    2531 Object.fac.functionalidadpush处的铬I(file:///android_asset/www/js/factorys.js:166:20)
    2531铬I在纽约(file:///android_asset/www/js/controllers.js:440:15)
    2531铬I在调用(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:12821:17)
    2531铬I在Object.instantiate(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:12829:27)
    2531铬I atfile:///android_asset/www/lib/ionic/js/ionic.bundle.js:17098:28
    2531铬I自组装元件(file:///android_asset/www/lib/ionic/js/ionic.bundle.js:48110:24)“,资料来源:file:///android_asset/www/lib/ionic
    /js/ionic.bundle.js(20243)
    1604 GCM D GcmService start Intent{act=com.google.android.c2dm.Intent.REGISTER pkg=com.google.android.gms cmp=com.google.android.gms/.GCM.GcmServi
    ce(有额外功能)}com.google.android.c2dm.intent.REGISTER
    2531 GCMBroadcastReceiver V onReceive:com.google.android.c2dm.intent.REGISTRATION
    2531 gcmregistar V将重试接收器类的名称设置为com.plugin.gcm.CordovaGCMBroadcastReceiver
    2531 GCMBroadcastReceiver V GCM IntentService类:com.plugin.GCM.gcminentservice
    2531 GCMBaseIntentService V获取尾波锁
    2531 GCMBasEventService V意向服务名称:GCMinentService-GCMinentService-1
    2531 GCMRegistar V注册接收机
    2531 GCMBasEventService D HandlerRegistration:registrationId=因隐私问题删除的令牌,错误=null,未注册=null
    2531 GCMRegistar D重置回退
    
    $scope.$on('$cordovaPush:notificationReceived', handleNotification);
    
    handleNotification = function(event, notification){
        $timeout(function(event, notification) {
                switch(notification.event) {
                    case 'registered':
                        if (notification.regid.length > 0 ) {
                            alert('registration ID = ' + notification.regid);
                            $scope.regid = notification.regid;
                            var user = { user: 'David', type: 'android', token: notification.regid };
                            $http.post('http://172.16.16.101:8000/tokens', JSON.stringify(user));
                        }
                        break;
    
                    case 'message':
                        // this is the actual push notification. its format depends on the data model from the push server
                        //alert('message = ' + notification.message + ' msgCount = ' + notification.msgcnt);
                        alert(JSON.stringify([notification]));
                        var aux = {title:'',message:'',payload: { valor1:true }}
                        $scope.mensajes.push(notification);
                        break;
    
                    case 'error':
                        alert('GCM error = ' + notification.msg);
                        break;
    
                    default:
                        alert('An unknown GCM event has occurred');
                        break;
                }
            });
    }
    
    /* 
       app.js
    */
    angular.module('notPush', ['ionic', 'notPush.controllers', 'notPush.factorys'])
    
    .run(function($ionicPlatform,$rootScope) {
      $ionicPlatform.ready(function() {
    
        if(window.cordova && window.cordova.plugins.Keyboard) {
          cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
        }
    
        if(window.StatusBar) {
          StatusBar.styleDefault();
        }
    
        $rootScope.mensajes = [];
    
        // Push code
        try{
          var pushNotification = window.plugins.pushNotification;
        } catch (ex){
    
        }
        var successfn = function(result){
          alert("Success: " + result);
        };
        var errorfn   = function(result){
          window.alert("Error: " + result);
        };
        window.casosPush = function(notification){
          switch (notification.event){
            case 'registered':
              if (notification.regid.length > 0){
                alert('registration ID = ' + notification.regid);
              }
              break;
    
            case 'message':
              alert(JSON.stringify([notification]));
              $rootScope.mensajes.push(notification);
              break;
    
            case 'error':
              alert('GCM error = ' + notification.msg);
              break;
    
            default:
              alert('An unknown GCM event has occurred');
              break;
          }
        };
        try{
          pushNotification.register(
            successfn,
            errorfn,
            {
              "senderID": "94XXXXXXXXXX",
              "ecb"     : "window.casosPush"
            }
          );
        } catch(notification){
    
        } 
      });
    })
    
    .config(function($stateProvider, $urlRouterProvider) {
    
      $stateProvider
    
      .state('splash', {
        url: '/splash',
        templateUrl: 'templates/splash.html',
        controller: 'SplashCtrl'
      })
    
      .state('registro', {
        url: '/registro',
        templateUrl: 'templates/registro.html',
        controller: 'RegistroCtrl'
      })
    
      .state('buzonMenu', {
        url: '/buzonMenu',
        templateUrl: 'templates/buzonMenu.html',
        controller: 'BuzonMenuCtrl'
      })
    
      .state('buzon', {
        url: '/buzon',
        templateUrl: 'templates/buzon.html',
        controller: 'BuzonCtrl'
      })
    
      .state('detallesSimple', {
        url: '/detallesSimple',
        templateUrl: 'templates/detallesSimple.html',
        controller: 'DetallesCtrl'
      })
    
      .state('detallesDoble', {
        url: '/detallesDoble',
        templateUrl: 'templates/detallesDoble.html',
        controller: 'DetallesCtrl'
      })
    
      .state('detallesWV', {
        url: '/detallesWV',
        templateUrl: 'templates/detallesWV.html',
        controller: 'DetallesWVCtrl'
      })
    
      // If none of the above states are matched, use this as the fallback:
      $urlRouterProvider.otherwise('/splash');
    
    });
    
    var exapp = angular.module('exapp',
                      ['ionic',
                       'ui.select2',
                       'exapp.controllers',
                       'exapp.services']);
    
    exapp.run(function($ionicPlatform, $state, Notifications, geo) {
        $ionicPlatform.ready(function() {
        try{
            var pushNotification = window.plugins.pushNotification;
        } catch (ex){
    
        }
        var successfn = function(result){
            // window.alert("S: " + result);
        };
        var errorfn   = function(result){
            // window.alert("E: " + result);
        };
        window.onCB = function(e){
            switch (e.event){
            case 'registered':
            if (e.regid.length > 0){
                localStorage.setItem('registration_id', e.regid);
            }
            break;
            case 'message':
            if (e.foreground){
                navigator.notification.beep(1);
            }
            $state.go('app.notifications');
            break;
            }
        };
        try{
            pushNotification.register(
            successfn,
            errorfn,
            {
                "senderID": "191919191919191",
                "ecb"     : "window.onCB"
            }
            );
        } catch(e){
    
        }
        });
    });
    
    // States
    exapp.config(function($stateProvider, $urlRouterProvider) {
        $stateProvider
    
        .state('app', {
            url: "/app",
            abstract: true,
            templateUrl: "templates/menu.html",
            controller: 'AppCtrl'
        })
    
        .state('app.profile', {
            url: "/profile",
            views: {
            'menuContent': {
                templateUrl: "templates/profile.html",
                controller: "ProfileCtrl"
            }
            }
        })
    
        .state('app.login', {
            url: "/login",
            views: {
            'menuContent' :{
                templateUrl: "templates/login.html",
                controller: 'AuthCtrl'
            }
            }
        });
    
        // if none of the above states are matched, use this as the fallback
        $urlRouterProvider.otherwise('/app/profile');
    });