Search code examples
cordovaphonegap-pushplugin

"ecb" doesn't work whit Cordova and PushPlugin


I've tried to register my device using pushNotification, using a demo. It doesn't work. Print "Cordova PushNotification Plugin Demo" and "registering android" and look the alert "OK" (successHandler function works). The problem is that doesn't work the "ecb". Why? Can you help me?

The plugin that I've installed with Cordova are: PushPlugin, Device, Notification, InAppBrowser and Network Information.

I've tried the app on my LG L9 and on emulator. Same problem.

This is the code:

<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>");
    window.plugins.pushNotification.register(successHandler, errorHandler, {
        "senderID": "my_id",
        "ecb": "onNotificationGCM"
    }); // required!
} else {
    $("#app-status-ul").append("<li>registering iOS</li>");
    pushNotification.register(tokenHandler, errorHandler, {
        "badge": "true",
        "sound": "true",
        "alert": "true",
        "ecb": "onNotificationAPN"
    }); // required!
}
}

// handle APNS notifications for iOS

function onNotificationAPN(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

function onNotificationGCM(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>

Solution

  • 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>