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



我正在使用 Firebase 消息功能向我的 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 不匹配时才显示通知。当应用程序位于前台时,这有效,但如果它在后台则不工作,因此如果用户编写然后在他收到通知之前关闭应用程序,它将在他收到通知时为他显示,这是我试图避免的。

如何确保只有群组中的其他成员收到通知?消息传递主题对此不利吗?

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

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

我想解决方案是:

  • group1的每个 iOS 客户端都将订阅主题/topics/group1.selfUserId
  • 服务器已具有属于组 1 的所有用户的列表
  • iOS 客户端要求服务器向selfUserId旁边的group1.members发送通知(发出 HTTP POST 请求)
  • 服务器发送获取selfUserId旁边的所有group1.members,并向所有/topics/group1.memberX发送通知

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

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

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

相关内容

  • 没有找到相关文章