向触发通知的用户以外的所有人发送通知?

Send notification to everybody but user who triggered it?

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

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

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

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 不匹配时才显示通知。这在应用程序位于前台时有效,但如果它在后台则无效,因此如果用户写入然后在他收到通知之前关闭应用程序,它将在他收到通知时为他显示,这是我试图避免的事情。

如何确保只有群组中的其他成员收到通知?消息主题不适合这个吗?

如果您使用主题,则无法发送给除一个以外的所有人。

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

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

所以你可以做的是向单个设备发送消息。比如你有一个十个人的群,一个人发一条消息,你要给群里的其他九个人发九条单条消息。

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

我想解决方案是:

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