【问题标题】:Send notification to everybody but user who triggered it?向除触发它的用户之外的所有人发送通知?
【发布时间】:2017-04-03 05:20:52
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 数据消息是否显示横幅?我需要立即通知用户。
    • 数据消息总是调用你的回调 onMessageReceived()。您可以使用 android api 显示横幅。
    【解决方案2】:

    我想解决办法是:

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

    【讨论】:

    • 这实际上可以很好地工作。虽然那时我认为使用注册令牌几乎是一回事,不是吗?
    • 注册令牌在 iOS 客户端上不可用,所以我建议坚持使用 id,它会起作用我已经实现了类似的东西。 ;)
    • 这很有趣。在这种情况下,会有很多不同的主题,这很贵吗?我不能只为每个用户创建一个主题并排除group1 部分吗?
    • 来自文档“主题消息支持每个应用程序的无限主题和订阅。”。我更新了答案,是的,避免group1 为更好理解而添加的部分
    【解决方案3】:

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

    因此,您可以将消息发送到单个设备。因此,例如,您有一个 10 人的群组,其中一个人发了一条消息,您必须向该群组的其他 9 人发送 9 条单条消息。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      相关资源
      最近更新 更多