kuklis kuklis - 1 month ago 40
Node.js Question

Firebase Cloud Messaging with Node.js server

I'm trying to send push notifications with FCM between individual devices using a node.js server and Swift 2.2 (based on Frank van Puffelen's Sending notifications between Android devices with Firebase Database and Cloud Messaging).

The notification request is successfully being handled by both Firebase Database and the Node.js server (adding request to database, fetching data from database, sending notification to topic) but I'm not getting any alert on my device.

When I launch the app,

func application(application: UIApplication, didReceiveRemoteNotification)
gets called and I'm able to print the notification but, compared to sending a notification through Firebase's interface, unfortunately no alert.

userInfo
from Node.js notification (No Alert):

[aps: {
alert = {
title = "This should be the text";
};
}, gcm.message_id: 0:1475766502047698%d4d04c12d4d04c12]


userInfo
from sending a notification through Firebase's interface (Alert works):

[gcm.notification.sound2: default, google.c.a.e: 1, aps: {
alert = This should be the text;
sound = default;
}, gcm.n.e: 1, google.c.a.c_id: ##Some Id###, google.c.a.udt: 0, gcm.message_id: 0:1475766412557820%d4d04c12d4d04c12, google.c.a.ts: ##Some Id 2##]


index.js:

var express = require('express');
var firebase = require("firebase");
var request = require('request');
var app = express();
var path = require("path");
var API_KEY = "Some Key"; // Your Firebase Cloud Server API key

app.set('port', (process.env.PORT || 5000));

app.use(express.static(__dirname + '/public'));

// views is directory for all template files
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

app.get('/', function(request, response) {
response.render('pages/index')
});

app.listen(app.get('port'), function() {
console.log('Node app is running on port', app.get('port'));
});

firebase.initializeApp({
serviceAccount: path.resolve(__dirname, './credentials/someCredentials.json'),
databaseURL: "https://someURL.firebaseio.com"
});

ref = firebase.database().ref();

function listenForNotificationRequests() {
var requests = ref.child('notificationRequests');
requests.on('child_added', function(requestSnapshot) {
var request = requestSnapshot.val();
sendNotificationToUser(
request.username,
request.message,
function() {
requestSnapshot.ref.remove();
}
);
}, function(error) {
console.error(error);
});
};

function sendNotificationToUser(username, message, onSuccess) {
request({
url: 'https://fcm.googleapis.com/fcm/send',
method: 'POST',
headers: {
'Content-Type' :' application/json',
'Authorization': 'key='+API_KEY
},
body: JSON.stringify({
notification: {
title: message
},
to : '/topics/user_'+username
})
}, function(error, response, body) {
if (error) { console.error(error); }
else if (response.statusCode >= 400) {
console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage);
}
else {
onSuccess();
}
});
}

// start listening
listenForNotificationRequests();


I would really appreciate it if someone could help me out with this :)

Answer

Found the answer: I had to change the sendNotificationToUser function by replacing title to body in my notification object and set the priority to high.

function sendNotificationToUser(username, message, onSuccess) {
  request({
    url: 'https://fcm.googleapis.com/fcm/send',
    method: 'POST',
    headers: {
      'Content-Type' :' application/json',
      'Authorization': 'key='+API_KEY
    },
    body: JSON.stringify({
    notification: {
    body: message, // Send your message in 'body'
    sound: 'default'
    },
    to : '/topics/user_'+username,
    priority: 'high' // Set the priority to high
    })
    }, function(error, response, body) {
      if (error) { console.error(error); }
      else if (response.statusCode >= 400) {
        console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage);
      }
      else {
        onSuccess();
      }
    });
}
Comments