Облачные функции для Firebase - отправка сообщения FCM нескольким токенам - PullRequest
0 голосов
/ 25 мая 2018

Я должен отправить сообщение многим токенам, когда в моей базе данных реального времени создается узел.
Я использую этот код, но любое уведомление теряется (люди не получают его).

 exports.sendMessage = functions.database.ref('/messages/{messageId}')
.onCreate((snapshot, context) => {
 const original = snapshot.val();

 let msg = {
    message: {
        data: {
            title: 'title2 test',
            body: 'body2 test',
            notify_type: 'chat_message',
            notify_id: ((new Date()).getTime()).toString(),
        },
        apns: {
            headers: {
                'apns-priority': '10',
                'apns-expiration': '0'
            },
            payload: {
                aps: { contentAvailable: true, sound:'' },
                'acme1': 'bar',
                title: 'title test',
                body: 'body test',
                notify_type: 'chat_message',
                notify_id: ((new Date()).getTime()).toString()
            }
        },
        token: token
    }
};

 var query = firebase.database().ref("users");
 return query.once("value")
      .then(function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
          var user = childSnapshot.val();
          var token = user.token;
          var username = user.username;
          msg.message.token = token;
          admin.messaging().send(msg.message).then((response) => {
                console.log('message sent to '+username);
            }).catch((error) => {
                console.log(error);
            });              
      });
    });
});
* 1004Правильно ли обещание «возврата»?Я думаю, что мне нужно подождать все "обещание admin.messagging (), но я не знаю, как я могу это сделать.

Большое вам спасибо.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Вот как вы отправляете FCM в массив токенов:

  return Promise.all([admin.database().ref(`/users/${user}/account/tokensArray`).once('value')]).then(results => {
    const tokens = results[0];
    if (!tokens.hasChildren()) return null;
    let payload = {
      notification: {
        title: 'title',
        body: 'message',
        icon: 'icon-192x192.png'
      }
    };
    const tokensList = Object.keys(tokens.val());
    return admin.messaging().sendToDevice(tokensList, payload);
  });
0 голосов
/ 25 мая 2018

Чтобы вернуть Обещание для всех действий по отправке, измените свой код так:

 return query.once("value")
      .then(function(snapshot) {
        var allPromises = [];
        snapshot.forEach(function(childSnapshot) {
          var user = childSnapshot.val();
          var token = user.token;
          var username = user.username;
          msg.message.token = token;
          const promise = admin.messaging().send(msg.message).then((response) => {
                console.log('message sent to '+username);
            }).catch((error) => {
                console.log(error);
            });
          allPromises.push(promise);              
      });
      return Promise.all(allPromises);
    });
0 голосов
/ 25 мая 2018

Вы можете отправлять уведомления на массив токенов.Я использую этот код для отправки уведомлений

return admin.messaging().sendToDevice(deviceTokenArray, payload, options).then(response => {
  console.log("Message successfully sent : " + response.successCount)
  console.log("Message unsuccessfully sent : " + response.failureCount)
});

Я думаю, вы можете найти больше информации здесь https://firebase.google.com/docs/cloud-messaging/admin/legacy-fcm

...