user3679710
user3679710

Reputation: 11

Implementing Push notification using Strongloop

I am trying to use strongloop loopback sdk 2.0. I tried to use the following code https://github.com/strongloop/loopback-component-push/tree/master/example/server which is loopback version 1.7.0. But when i try compile with version 2.0, it throws me error

Error: The data in model-config.json is in the unsupported 1.x format.

I had also tried as per the strong loop tutorial, but still it does not work. Anyone has suggestion or sample code on how to implement PUSH notification using loopback 2.0?

Upvotes: 1

Views: 1705

Answers (2)

Robins Gupta
Robins Gupta

Reputation: 3153

  1. Create 4 models application, installation, notification, push

In common/models/application.json

{
  "name": "push",
  "plural": "Push",
  "base": "Model",
  "properties": {},
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": []
}

In common/models/installation.json

{
  "name": "installation",
  "base": "Installation",
  "properties": {},
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": []
}

In common/models/notification.js

{
  "name": "notification",
  "base": "Notification",
  "properties": {},
  "validations": [],
  "relations": {},
  "acls": [
    {
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW",
      "property": "sendMessage"
    }

  ],
  "methods": []
}

In common/models/push.json

{
  "name": "push",
  "plural": "Push",
  "base": "Model",
  "properties": {},
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": []
}

server/datasource.json

...
...
"push": {
    "name": "push",
    "connector": "loopback-component-push",
    "installation": "installation",
    "notification": "notification",
    "application": "application"
}

In common/models/notification.js

  module.exports = function(Notification) {

   var badge = 1;

    //DEFINING A PROPERTY IN NOTIFICATION FOR SENDING  PUSH MESSAGE
    Notification.sendMessage = function(message, registrationId, from, callback) {
          var app = this.app;
        from = from? from:'COMPANY_NAME';
        sendMessage(app, message, registrationId, from, callback);
    }//sendMessage Notification method..



    //FUNCTION FOR SENDING PUSH MESSAGE..
    var sendMessage = function(app, message, registrationId, from, callback){
      var Application = app.models.application;
      var PushModel = app.models.push;

      var note = new Notification({
        expirationInterval: 3600, // Expires 1 hour from now.
        badge: badge++,
        //  sound: 'ping.aiff',
        message: message,
        messageFrom: from
      });

      PushModel.notifyById(registrationId, note, function (err) {
        if (err) {
          console.error('Cannot notify %j: %s', registrationId, err.stack);
          return callback(err);
        }
        console.log('Pushing notification to %j', registrationId);
        callback(null, []);
      });
    }//sendMessage function




  //Now registering the method
    Notification.remoteMethod(
        'sendMessage', 
        {
          accepts: [{arg: 'message', type: 'string', required:true},
          {arg: 'registrationId', type: 'string', required:true},
          {arg: 'from', type: 'string', required:true}],
          description: "Sending message from notification.."
        }
    )

}//module.exports

Now inside server/ folder create a file push-service.js

    module.exports = function(app) {
    var Notification = app.models.notification;
    var Application = app.models.application;
    var PushModel = app.models.push;
    function startPushServer() {

    PushModel.on('error', function(err) {
      console.error('Push Notification error: ', err.stack);
    });

    // Pre-register an application that is ready to be used for testing.
    // You should tweak config options in ./config.js

    var loopbackApp = {
      id: 'loopback-push-application',
      userId: 'strongloop',
      name: config.appName,

      description: 'loopback Push Notification Service',
      pushSettings: {
        apns: {
          certData: "APPLE CERT. DATA",
          keyData: "APPLE KEY DATA",
          pushOptions: {
            // Extra options can go here for APN
          },
          feedbackOptions: {
            batchFeedback: true,
            interval: 300
          }
        },
        gcm: {
          serverApiKey: "PASTE YOUR GOOGLE GCM KEY HERE"
        }
      }
    };



    updateOrCreateApp(function(err, appModel) {
      if (err) {
        throw err;
      }
      console.log('Application id: %j', appModel.id);
    });


    function updateOrCreateApp(cb) {
      Application.findOne({
          where: {
            id: loopbackApp.id
          }
        },
        function(err, result) {
          if (err) cb(err);
          if (result) {
            delete loopbackApp.id;
            result.updateAttributes(loopbackApp, cb);
          } else {
            return registerApp(cb);
          }
        });
    } //updateOrCreate function



    Application.beforeSave = function(next) {
      if (this.name === loopbackApp.name) {
        this.id = 'loopback-push-application';
      }
      next();
    };

    Application.register(
      loopbackApp.userId,
      loopbackApp.name, {
        description: loopbackApp.description,
        pushSettings: loopbackApp.pushSettings
      },
      function(err, app) {
        if (err) {
          return cb(err);
        }
        return cb(null, app);
      }
    );
    } //register App

    } //startPushServer

    startPushServer();

    };

Now finally in server.js

....
....

//Adding push service to the backend..
require('./push-service')(app);

....

Now run the loopback server open api explorer and go to NOTIFICATION->SendMessage method and type any message and it will send push notification on connected devices.

NOTE: You also need to configure push services from android/iphone to enable sending push application. For detail check loopback documentation.

Upvotes: 5

Related Questions