1
myApp.services.factory('GCMHelper', ($q)-> 

    pushNotification = {} 

    _init =()-> 
    defer = $q.defer() 

    ionic.Platform.ready(()-> 
     pushNotification = window.plugins.pushNotification; 
     window.onNotification = (res)-> 
     console.log('onNotification', res) 
     defer.resolve() 
    ) 

    return defer.promise 

    return { 
    register:()-> 
     _init().then(()-> 
     pushNotification.register(
      (res)-> 
      console.log('gcm register success', res) 
      (err)-> 
      console.log('gcm register err', err) 
      { 
      "senderID": "*********", 
      "ecb": "onNotification" 
      } 
     ); 
    ) 
    } 
) 

을 발사 "OK"문자열로 표시되지만 ecb onNotification은 절대로 실행되지 않으며 콘솔에서는 오류가 발생하지 않습니다. 나는 거의 그걸로 이상이 없다 ... 어느 누구도 도와 줄 수 있니?코르도바 PushPlugin onNotification의 ECB하지 컨트롤러

답변

6

Android 및 iOS의 푸시 알림에 다음을 사용합니다. 그것은 당신을 위해 제대로 작동합니다. 앱을 설치 한 후 사용자는 통화 ecb 메소드를 위해 앱을 열어야합니다. iOS에서 PushNotifcation의 register success 메소드는 결과에 모바일 레지스터 ID를 반환하지만 안드로이드에서는 OK 만 반환합니다. Android에서는 onNotificationGCM 메소드가 2 가지 유형의 이벤트 1) RegisterId 및 2) 알림 메시지에 대해 호출됩니다. 또한 $ ionicPopup.alert()를 사용하여 show notification 팝업에 showNotificationAPN/GCM 메소드를 추가했습니다.

.run(function ($ionicPlatform, PushProcessingService) { 

    $ionicPlatform.ready(function() { 
     try { 
      PushProcessingService.initialize(); 
     } catch (e) { 
      //hide event 
     } 
    }) 
}) 

.factory('PushProcessingService', ["$window", "$ionicPopup", function ($window, $ionicPopup) { 
    function onDeviceReady() { 
     var pushNotification = window.plugins.pushNotification; 
     if (ionic.Platform.isAndroid()) { 
      pushNotification.register(gcmSuccessHandler, gcmErrorHandler, {'senderID': 'XXXXXXXXXXXXXX', 'ecb': 'onNotificationGCM'}); 
     } else if (ionic.Platform.isIOS()) { 
      var config = { 
       "badge": "true", 
       "sound": "true", 
       "alert": "true", 
       "ecb": "pushCallbacks.onNotificationAPN" 
      }; 
      pushNotification.register(gcmSuccessHandler, gcmErrorHandler, config); 
     } 

     var addCallback = function addCallback(key, callback){ 
      if(window.pushCallbacks == undefined){ 
       window.pushCallbacks = {}; 
      } 
      window.pushCallbacks[key] = callback({registered:true}); 
     } 
    } 

    function gcmSuccessHandler(result) { 
     console.log("Register push notification successfully : " + result); 
     if (ionic.Platform.isIOS()) { 
      var mobileType = "ios"; 
      var mobileRegisterId = result; 
      // Save the ios mobile register Id in your server database 
      // call the following method on callback of save 
       addCallback("onNotificationAPN", onNotificationAPN);    
     } 
    } 

    function gcmErrorHandler(error) { 
     console.log("Error while register push notification : " + error); 
    } 

    return { 
     initialize: function() { 
      document.addEventListener('deviceready', onDeviceReady, false); 
     }, 
     registerID: function (id) { 
      var mobileType = "android"; 
      // Save the android mobile register Id in your server database 
      console.log("RegisterId saved successfully."); 
     }, 
     showNotificationGCM: function (event) { 
      $ionicPopup.alert({ 
       title: "Pajhwok Notification", 
       subTitle: event.payload.type, 
       template: event.payload.message 
      }); 
     }, 
     showNotificationAPN: function (event) { 
      $ionicPopup.alert({ 
       title: event.messageFrom + "..", 
       subTitle: event.alert, 
       template: event.body 
      }); 
     } 
    } 
}]) 

onNotificationAPN = function(event) { 
    if (!event.registered) { 
     var elem = angular.element(document.querySelector('[ng-app]')); 
     var injector = elem.injector(); 
     var myService = injector.get('PushProcessingService'); 
     myService.showNotificationAPN(event); 
    } else { 
     console.log("Registered successfully notification.."); 
    } 
} 

function onNotificationGCM(e) { 
    switch(e.event) 
    { 
     case 'registered': 
      if (e.regid.length > 0) 
      { 
       // Your GCM push server needs to know the regID before it can push to this device 
       // here is where you might want to send it the regID for later use. 
       var elem = angular.element(document.querySelector('[ng-app]')); 
       var injector = elem.injector(); 
       var myService = injector.get('PushProcessingService'); 
       myService.registerID(e.regid); 
      } 
      break; 

     case 'message': 
      // if this flag is set, this notification happened while we were in the foreground. 
      // you might want to play a sound to get the user's attention, throw up a dialog, etc. 
      var elem = angular.element(document.querySelector('[ng-app]')); 
      var injector = elem.injector(); 
      var myService = injector.get('PushProcessingService'); 
      myService.showNotificationGCM(e); 
      break; 

     case 'error': 
      alert('<li>ERROR :' + e.msg + '</li>'); 
      break; 

     default: 
      alert('<li>Unknown, an event was received and we do not know what it is.</li>'); 
      break; 
    } 
}