“ecb” doesn't work whit Cordova and PushPlugin

妖精的绣舞 提交于 2019-12-03 22:16:03

As Hanh Le said, you need to have the ecb-callback to be accessible from the window-object

Like this

    pushNotification.register(tokenHandler, errorHandler, {
       "badge": "true",
       "sound": "true",
       "alert": "true",
       "ecb": "window.onNotificationAPN"
    }); // required!

and then replace

     function onNotificationAPN(e) {

with

    window.onNotificationAPN = function(e) {

EDIT: here is the whole code you posted edited in a way I think should work:

<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script type="text/javascript" charset="utf-8" src="jquery_1.5.2.min.js"></script>
<script type="text/javascript" src="PushNotification.js"></script>        
<script type="text/javascript">
var pushNotification;

document.addEventListener("deviceready", onDeviceReady, false);
// device APIs are available

function onDeviceReady() {
    pushNotification = window.plugins.pushNotification;
    if (device.platform == 'android' || device.platform == 'Android') {
        $("#app-status-ul").append("<li>registering android</li>");
        pushNotification.register(successHandler, errorHandler, {
           "senderID": "my_id",
           "ecb": "window.onNotificationGCM"
        }); // required!
    } else {
         $("#app-status-ul").append("<li>registering iOS</li>");
         pushNotification.register(tokenHandler, errorHandler, {
            "badge": "true",
            "sound": "true",
            "alert": "true",
            "ecb": "window.onNotificationAPN"
         }); // required!
   }
}

// handle APNS notifications for iOS

window.onNotificationAPN = function(e) {
   if (e.alert) {
      navigator.notification.alert(e.alert);
   }
   if (e.sound) {
      var snd = new Media(e.sound);
      snd.play();
   }
   if (e.badge) {
      pushNotification.setApplicationIconBadgeNumber(successHandler, e.badge);
   }
}
// handle GCM notifications for Android

window.onNotificationGCM = function(e) {
   navigator.notification.alert(e.event);
   switch (e.event) {
      case 'registered':
      if (e.regid.length > 0) {
          navigator.notification.alert(e.regid);
          // 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.
         $("#app-status-ul").append("<li>regID = " + e.regid +"</li>");
         sessionStorage.setItem("deviceId",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.
         if (e.foreground) {
            navigator.notification.alert('--INLINE NOTIFICATION--');
            // if the notification contains a soundname, play it.
            var my_media = new Media("/android_asset/www/" + e.soundname);
            my_media.play();
         } else { // otherwise we were launched because the user touched a notification in the notification tray.
           if (e.coldstart) navigator.notification.alert('--COLDSTART NOTIFICATION--');
           else navigator.notification.alert('--BACKGROUND NOTIFICATION--');
         }
         navigator.notification.alert(e.payload.message);
         navigator.notification.alert('MESSAGE -> MSGCNT: ' + e.payload.msgcnt);
         break;
    case 'error':
       navigator.notification.alert('ERROR -> MSG:' + e.msg);
    break;
    default:
       navigator.notification.alert('EVENT -> Unknown, an event was received and we do not know what it is');
    break;
  }
}

function tokenHandler(result) {
   navigator.notification.alert(result, null, 'Alert', 'OK');
   sessionStorage.setItem("deviceId", result);
   sessionStorage.setItem("notificationServer", "APNS");
   // Your iOS push server needs to know the token before it can push to this device
   // here is where you might want to send it the token for later use.
}

function successHandler(result) {
   navigator.notification.alert(result, null, 'Alert', 'OK');
   sessionStorage.setItem("deviceId", result);
   sessionStorage.setItem("notificationServer", "GCM");
}

function errorHandler(error) {
   navigator.notification.alert(error, null, 'Alert', 'OK');
}

document.addEventListener('deviceready', onDeviceReady, true);

</script>
<div id="home">
    <div id="app-status-div">
        <ul id="app-status-ul">
            <li>Cordova PushNotification Plugin Demo</li>
        </ul>
    </div>
</div>

you can put your onNotificationGCM function outside of the controller. That is the easiest solution that work for me.

  1. create external js file eg : push.js
  2. paste your onNotificationGCM function inside push.js without any angularjs API like angular.module or .controller

I have found the solution for this one in case of iOS. The reason for this issue is that in PushPlugin.m the callback property is set to nil on killing the app. As a result, the check on line#202 is not satisfied in the - (void)notificationReceived callback. The fix for the issue is to instantiate the PushPlugin class on opening the push notification every time your app starts. This can be done by registering the push notification plugin on app start. Call the pushNotification.register method in your javascript everytime your app starts, and this will instantiate the plugin and assign the appropriate callback the plugin. I have added the below code to my Ionic app's app.run() section

window.plugins.pushNotification.register(successCallback, errorCallback, {
    badge: 'true',
    sound: 'true',
    alert: 'true',
    ecb: 'window.onNotificationAPN'})
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!