我使用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不匹配时才显示通知。这在应用程序位于前台时有效,但在背景中则无效,因此如果用户写入然后在收到通知之前关闭应用程序,则在收到应用程序时会显示该应用程序,这是我所做的事情。试图避免。
如何确保只有群组中的其他成员才能收到通知?消息传递主题不是很好吗?
答案 0 :(得分:2)
如果您使用主题,则无法向除(1)以外的所有人发送。
如果您发送给所有人,然后在客户端上进行过滤,则需要使用数据消息,而不是通知消息,以避免您所描述的后台/前台问题。 https://firebase.google.com/docs/cloud-messaging/concept-options
答案 1 :(得分:1)
我猜解决方案是:
group1
的每个iOS客户端都会订阅主题/topics/group1.selfUserId
group1.members
旁边的selfUserId
发送通知(发送http帖子请求)group1.members
旁边的所有selfUserId
并向所有/topics/group1.memberX
发送通知答案 2 :(得分:0)
如前所述,您不能排除已注册到主题的人。
所以你能做的就是向单个设备发送消息。例如,您有一组十人,一个人发布消息,您必须向该组的其他九个人发送九条单个消息。
您需要做的是将每个用户的注册令牌存储到您的数据库中,并且您必须考虑到注册令牌会在一段时间后发生变化。