我正在使用 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
发送通知
如前所述,您不能排除已注册到主题的人。
因此,您可以做的是向单个设备发送消息。例如,你有一个十个人的小组,一个人发布一条消息,你必须向小组中的其他九个人发送九条消息。
您需要做的是将每个用户的注册令牌存储到数据库中,并且您必须考虑到注册令牌将在一段时间后更改。