除了触发它的用户之外,向所有人发送通知?

我正在使用Firebase Messaging向我的iPhone应用程序的用户发送通知。 我的数据库结构如下:

- Users - user1 - user2 - Groups - group1 - members - user1 - user2 

当用户加入组时,他们会订阅与该组对应的主题 。 我有一个云函数,用于侦听该组中的写入,并在发生写入时向组主题发送通知:

 exports.sendNotifs = functions.database .ref('pets/{petId}/events/{eventId}').onWrite(event => { const pet_Id = event.params.petId; const payload = { 'notification': { 'title': `${toTitleCase(name)} just logged an event`, 'body': `${events[eventType]} for ${toTitleCase(petName)}`, 'sound': 'default', } }; admin.messaging().sendToTopic(pet_Id, payload); }); 

但是,这会导致每个人都收到通知,包括执行写入触发通知的人。 我只希望组中的其他人显示通知,因为触发用户不需要查看通知。 我尝试将发送用户的uid作为通知的额外数据附加,并且仅在接收用户的uid与通知数据的uid不匹配时才显示通知。 这在应用程序位于前台时有效,但在背景中则无效,因此如果用户写入,则在收到通知之前关闭应用程序,当他收到通知时,它将为他显示,这是我试图避免的。

如何确保只有组中的其他成员才能收到通知? 消息传递主题不是很好吗?

我猜这个解决方案是:

  • group1每个iOS客户端都将订阅主题/topics/group1.selfUserId
  • 服务器已经拥有列表,其中包含属于group1的所有用户
  • iOS客户端要求服务器向group1.members旁边的selfUserId发送通知(发出http post请求)
  • server send获取group1.members旁边的所有/topics/group1.memberX并向所有/topics/group1.memberX发送通知

如果你使用主题,除了一个之外,不可能发送给所有人。

如果您正常发送给所有人,然后在客户端上进行过滤,则需要使用数据消息而不是通知消息,以避免您描述的后台/前台问题。 https://firebase.google.com/docs/cloud-messaging/concept-options

如前所述,您不能排除已注册到主题的人。

因此,您可以做的是向单个设备发送消息。 因此,例如,您有一组十人,一个人发布消息,您必须向该组的其他九个人发送九条单个消息。

您需要做的是将每个用户的注册令牌存储到您的数据库中,并且您必须考虑注册令牌将在一段时间后更改。