Prabhu
Prabhu

Reputation: 13335

Can’t get push notifications in Android to work using ngCordova

I'm having a tough time getting push notifications (using the ngCordova plugin) to work. I have followed their sample code exactly as is documented on the site: http://ngcordova.com/docs/plugins/pushNotifications/

(the only difference is that I don't have a deviceready listener, instead, my code is inside the ionicPlatform.ready listener.)

Here is my code:

angular.module('myApp', ['ionic', 'ngCordova'])
.run(function($ionicPlatform, $rootScope, $state, $cordovaPush) {
  $ionicPlatform.ready(function() {
    var config = {
      "senderID": "myID100001000"
    };

    $cordovaPush.register(config).then(function(result) {
      alert(result);
    }, function(err) {
      alert(err);
    })      
  }); 

  $rootScope.$on('$cordovaPush:notificationReceived', function(event, notification) {
    switch(notification.event) {
      case 'registered':
        if (notification.regid.length > 0 ) {
          alert('registration ID = ' + notification.regid);
        }
        break;

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

When my app starts I do get the "OK" alert, so I know it successfully goes through the $cordovaPush.register call. However, I was expecting to get a "registered" notification event, right after, but I never get notified.

Any help would be appreciated.

Upvotes: 8

Views: 4677

Answers (2)

hdomos
hdomos

Reputation: 1209

I have suffered with this a lot and I have found out, that there are in fact two versions of the cordova push plugin currently:

Both are supported by ngCordova, but only the deprecated version is documented.

The deprecated version is $cordovaPush and the newer one is $cordovaPushV5, and they have completely different methods.

For me the problem was that I downloaded the cordova-plugin-push and tried to implement it with the old documentation on ngCordova site.

The code is:

 /*
         * Non deprecated version of Push notification events
         */
        function registerV5() {

            $ionicLoading.show({
                template: '<ion-spinner></ion-spinner>'
            });

            if (ionic.Platform.is('browser')) {
                alert("You are running on broswer, please switch to your device. Otherwise you won't get notifications");
                $ionicLoading.hide();
                return;
            }

            /**
             * Configuration doc:
             * https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/API.md#pushnotificationinitoptions
             */
            var GCM_PROJECT_ID = 'xxxxxx';

            $cordovaPushV5.initialize({
                "android": {
                    "clearNotifications": false,
                    "senderID" : GCM_PROJECT_ID
                }
            });

            $cordovaPushV5.register().then(function (deviceToken) {
                console.log("Successfully registered", deviceToken);

                $scope.data.deviceToken = deviceToken;

                // Below code required to configure $cordovaPushV5 notifications emitter. 
                // Don't pass function it's not handler.
                $cordovaPushV5.onNotification();
                $cordovaPushV5.onError();

                $ionicLoading.hide();
            }, function (error) {
                console.log("Failed to registered");
                console.log("error object : ", error);
                $ionicLoading.hide();
            });
        }

        $rootScope.$on('$cordovaPushV5:notificationReceived', function(event, data) {
            console.log("notification received");
            console.log("data object: ", data);

            var foreground = data.additionalData.foreground || false;
            var threadID = data.additionalData.payload.threadID || '';
            var group = data.additionalData.payload.group || false;

            if (foreground) {
                // Do something if the app is in foreground while receiving to push - handle in app push handling
                console.log('Receive notification in foreground');
            } else {
                // Handle push messages while app is in background or not started
                console.log('Receive notification in background');
                // Open FB messanger app when user clicks notification UI when app is in background.
                if (typeof data.additionalData.coldstart != "undefined" && data.additionalData.coldstart == false)
                    if (!group)
                        // Open FB Messenger of specific user chat window
                        window.open('fb-messenger://user/' + threadID, '_system', 'location=no');
                    else
                        // Open FB Messenger of specific group chat window
                        window.open('fb-messenger://groupthreadfbid/' + threadID, '_system', 'location=no');                
            }
        });

        $rootScope.$on('$cordovaPushV5:errorOccurred', function(event, error) {
            console.log("notification error occured");
            console.log("event object: ", event);
            console.log("error object: ", error);
        });

More on this github article: https://github.com/driftyco/ng-cordova/issues/1125 (code from here) and in this article: https://github.com/yafraorg/yafra/wiki/Blog-Ionic-PushV5

Upvotes: 1

Marc Climent
Marc Climent

Reputation: 9484

The solution is in the comments but this needs a proper answer.

First of all, the register callback always returns OK as long as you pass a senderID, but if the $cordovaPush:notificationReceived event is never called (it may take a few seconds), this ID is probably wrong.

You must use the Project Number, not the Project ID.

To get the number, go to the API Console, select the project and you'll be on the Overview page. On top of this page, you'll see something like this:

Project ID: your-project-id        Project Number: 0123456789

Just copy and use the project number and everything should work.

Upvotes: 8

Related Questions