Chris
Chris

Reputation: 312

Firebase Cloud Function Push Notification Really Slow

I have an iOS app that sends a time sensitive push notification from an event via Cloud Firestore-triggered function.

In my function, I do a simple get operation prior to sending out the push notification, and it gets delivered from 30 sec up to 1 min. Can anyone advise on improving the speed?

I've looked at the online documentation talking about setting a minimum # of instances to reduce a cold start. I've also looked at this SO answer. As someone that's new to this, I admittedly am having difficulty following and pinpointing my advised next step. Any help and guidance would be extremely appreciated.

  exports.pushNotification = functions.firestore.document('/users/{userId}').onUpdate((change, context) => {  
var recipientUid = context.params.userId;

return admin.firestore().collection('users').doc(recipientUid).get().then(doc => {
  const userData = doc.data();
  var fcmToken = userData.fcmToken;

      var message = {
        notification: {
          title: sendingTitle,
          body: sendingMessage
        },
        apns : {
          payload : {
            aps : {
              badge : 1,
              sound: "default"
            }
          }
        },
        token: fcmToken
      };

      admin.messaging().send(message)
      .then((response) => {

        console.log('Successfully sent push notification message:', response);
        return;
      })
      .catch((error) => {
        console.log('Error sending message:', error);
        return;
      });
    })
  });

Upvotes: 0

Views: 1483

Answers (1)

Renaud Tarnec
Renaud Tarnec

Reputation: 83163

One possible cause is that you don't correctly manage the life cycle of your Cloud Function: as a matter of fact you are not returning the Promises chain, as shown below (see the comments in the code):

exports.pushNotification = functions.firestore.document('/users/{userId}').onUpdate((change, context) => {
    var recipientUid = context.params.userId;

    return admin.firestore().collection('users').doc(recipientUid).get()
        .then(doc => {
            const userData = doc.data();
            var fcmToken = userData.fcmToken;

            var message = { ... };

            return admin.messaging().send(message)   // !!! See the return here
        })    // And see also that we close the then block here
        .then((response) => {
            console.log('Successfully sent push notification message:', response);
            return;
        })
        .catch((error) => {
            console.log('Error sending message:', error);
            return;
        });
});

For more details on how to correctly manage the life cycle, I would suggest you watch the 3 videos about "JavaScript Promises" from the Firebase video series as well as read the following doc. Also, reading the doc on how to chain Promises will help.

Upvotes: 1

Related Questions