我刚刚第一次让Firebase函数推送通知工作。 我正在监视以下更改:
exports.observeNotifications = functions.database.ref('/notifications/{user_id}/{notification_id}').onWrite((change, context) => {
后来,我使用:
const userQuery = admin.database().ref(`users/${from_user_id}/username`).once('value');
const deviceToken = admin.database().ref(`/users/${user_id}/device_token`).once('value');
检索发件人的用户UID和设备令牌,稍后与sendToDevice()
一起使用
这工作正常,是我在任何地方看到推荐的方法,但我想知道为什么要在用户到用户场景中使用主题来执行此操作。
在聊天应用程序的示例中,每次发送聊天时,都会向notifications/users/{uid} ...
发送一个值并触发事件。然后必须进行值调用,必须完成承诺处理,然后可以配置和发送推送有效负载。
对于主题,当用户首次加载应用程序时,您可以为用户订阅类似"chat_notifications_usersIUID"的主题。这消除了获取设备令牌并完成使用承诺的过程的需要,并大大简化了向特定用户发送通知的过程,只需推送到特定于收件人 UID 的特定主题。
在用户之间发送推送通知时,使用主题而不是 Firebase 函数观察是否有任何缺点?
主题可公开访问。因此,即使您为每个用户创建了一个主题,所有用户也可以订阅其中每个主题。
因此,如果消息被视为公共消息,则只应以这种方式使用主题。 例如,在公共聊天室场景中,这可能没问题,因为无论如何,每个人都已经可以在公共聊天室中看到消息。但是通过主题发送私人消息意味着其他用户在知道用户的主题时可以拦截它们。
如果你的消息不是公开的,你将需要发送到各个令牌。只有在极端情况下,您才应该达到速率限制。如果您遇到这种情况,请联系 Firebase 支持团队,获取有关问题排查的个性化帮助