向多个用户推送通知

时间:2018-07-15 12:06:31

标签: javascript android firebase-realtime-database firebase-cloud-messaging google-cloud-functions

我正在开发一个应用程序,该应用程序允许协会中的所有单位所有者通过应用程序本身添加厨师。我将所有数据存储在Firebase中。单位所有者将其厨师的详细信息添加到应用程序中,当厨师进入社会为其服务时,警卫队会通过推送通知对厨师和单位所有者进行身份验证。

现在的问题是,当有一个厨师只为一个单位工作时,推送通知会顺利通过。但是,当厨师为多个单位工作时,只会通知一个单位所有者。在Firebase结构中位于“ Cook”分支下最高的那个人。

我希望所有单位所有者都能通过推送通知得到通知。

我在这里提到我的JavaScript代码,该代码充当执行设备到设备通知过程的中介。我想我需要在这里自己进行更改。

exports.dailyServiceNotification = functions.database.ref('/dailyServices/all/public/{dailyServiceType}/{dailyServiceUID}/status')
  .onWrite((change, context) => {

    const dailyServiceType = context.params.dailyServiceType;
    const dailyServiceUID = context.params.dailyServiceUID;

    return admin.database().ref("/dailyServices").child("all").child("public").child(dailyServiceType).child(dailyServiceUID).once('value').then(queryResult => {
      const status = queryResult.val().status;
      if(status.localeCompare("Not Entered") === 0)
        return null;

      return queryResult.forEach((userSnap) => {
        var userUID = userSnap.key;
        console.log("User UID : " + userUID);

        return admin.database().ref("/users").child("private").child(userUID).once('value').then(queryResult => {
        const tokenId = queryResult.val().tokenId;
        const payload = {
          data: {
            message: "Your " + dailyServiceLookup[dailyServiceType] + " has " + status + " your society.",
            type: "Daily_Service_Notification"
          }
        };

        return admin.messaging().sendToDevice(tokenId, payload).then(result => {
          return console.log("Notification sent");
        });             

      });

    });

  });

}); 

1 个答案:

答案 0 :(得分:0)

请尝试以下操作:

exports.dailyServiceNotification = functions.database.ref('/dailyServices/all/public/{dailyServiceType}/{dailyServiceUID}/status').onWrite((change, context) => {
  const dailyServiceType = context.params.dailyServiceType;
  const dailyServiceUID = context.params.dailyServiceUID;
  const promises = [];
  return admin.database().ref("/dailyServices").child("all").child("public").child(dailyServiceType).child(dailyServiceUID).once('value').then(queryResult => {
    const status = queryResult.val().status;
    if (status.localeCompare("Not Entered") === 0) return null;
    queryResult.forEach((userSnap) => {
      var userUID = userSnap.key;
      const uP = admin.database().ref("/users").child("private").child(userUID).once('value').then(queryResult => {
        const tokenId = queryResult.val().tokenId;
        const payload = {
          data: {
            message: "Your " + dailyServiceLookup[dailyServiceType] + " has " + status + " your society.",
            type: "Daily_Service_Notification"
          }
        };
        return admin.messaging().sendToDevice(tokenId, payload);
      });
      promises.push(uP);
    });
  }).then(() => {
    return Promise.all(promises);
  });
});