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

时间:2017-04-03 05:20:52

标签: ios firebase apple-push-notifications firebase-cloud-messaging google-cloud-functions

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

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

3 个答案:

答案 0 :(得分:2)

如果您使用主题,则无法向除(1)以外的所有人发送。

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

答案 1 :(得分:1)

我猜解决方案是:

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

答案 2 :(得分:0)

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

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

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