向多个用户推送通知

Posted

技术标签:

【中文标题】向多个用户推送通知【英文标题】:Push Notification to multiple users 【发布时间】:2018-12-23 04:44:44 【问题描述】:

我正在开发一个应用程序,它允许社团中的所有公寓业主通过应用程序本身添加他们的厨师。我将所有数据存储在 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");
        );             

      );

    );

  );

); 

【问题讨论】:

我已经在我的一个 tutorials 中逐步说明了如何发送 notifications 但使用 Cloud Firestore,而不是 Firebase实时数据库和 Node.js。有兴趣的可以看看。 【参考方案1】:

请试试这个:

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);
  );
);

【讨论】:

以上是关于向多个用户推送通知的主要内容,如果未能解决你的问题,请参考以下文章

iOS 向大量用户推送通知

Azure 向多个设备/广播发送推送通知

Android 通知 - 为多个用户推送通知

如何在具有多个登录用户的 iOS 设备上处理推送通知?

如何在一个请求中向多个设备(iOS)发送推送通知?

多用户的 Worklight 推送通知