向订阅主题的所有用户推送通知,使用 FCM Firebase 的登录用户除外

Posted

技术标签:

【中文标题】向订阅主题的所有用户推送通知,使用 FCM Firebase 的登录用户除外【英文标题】:Push notification to all the users subscribed to the topic except login user using FCM Firebase 【发布时间】:2019-11-05 09:36:02 【问题描述】:

现在我有一个拥有一万多名成员的组,我为一个组创建了一个主题(通知主题),该组中的所有用户都订阅了该主题。现在,在组内,任何用户都可以添加图片、文件或视频等帖子。当用户添加帖子时,我需要向订阅该主题的所有用户发送通知,但除了一个,即添加帖子的人。我怎样才能做到这一点??

现在通知将发送给所有用户,包括添加帖子的人。

【问题讨论】:

【参考方案1】:

目前没有任何类型的参数可以排除特定用户接收来自他们订阅的主题的消息。但是,作为一种解决方法,您可以简单地使用自定义实现来构建有效负载并处理消息以接收它。

根据您构建有效负载的方式,您可以添加一个自定义键值对,其中包含发布数据的用户 ID(例如 posterId 或简单的 userId)。

然后在您的客户端,在处理推送通知时,只需检查 id 是否是用户的。如果是同一用户,则不显示通知,否则显示。例如:

if (userId == currentUserId) 
    // if user is the one that sent the message, don't show the notification
    return;

【讨论】:

这样我们可以避免在通知托盘中为该用户显示通知吗?? 如果您使用的是data-only 消息负载,这是可能的。但是如果你有notification参数,那么没有(当你的应用在后台时,android系统会自动处理notification消息)。我提到的只是一个示例,以提供有关如何绕过它的想法。我认为还有其他方法可以解决这个问题。 不客气。也看看Cloud Functions for Firebase。根据这个用例,它可能很有用。 :) 我想知道如何将“阅读次数最多的文章”发送到某个主题,但排除那些已经看过/阅读过的用户?我需要在客户端保留已读文章列表吗?如果是这种情况,则在未启动应用程序时可能无法正常工作。 @abiieez 我认为在将它们添加到主题之前对 id 进行过滤可以更好地解决这个问题。检查 userId 之前是否阅读过该主题(我假设每个用户都有一个列表),true = 不添加,false = 添加。然后根据需要取消订阅。【参考方案2】:

尽管这个问题已经得到解答并且有点陈旧,但还是有一种解决方法。因此,我仍然会添加答案以供将来参考。您可以做的是取消订阅用户的主题,将消息发送到主题并再次订阅用户。当然,这需要更多的工作和对 Firebase 的调用,但是你已经得到了你想要的。

只是一个想法

【讨论】:

对我有用:只是不要忘记在订阅网络慢的情况下添加几秒钟 Timer(Duration(seconds: 5), () firebaseMesseging.subscribeToTopic("POST") ; ); @Erik Dohmen 为了取消用户的订阅,我们需要应用实例的注册令牌,例如,如果用户使用多个设备,那么我们需要获取用户的所有注册令牌,然后调用 unssubscribeTopic () 在所有令牌上。所以为此我们需要将所有令牌存储在数据库中。那么管理令牌(存储在数据库中)可能会非常困难。有没有办法在应用服务器上不管理这个令牌? 是否保证“取消订阅”在消息发送之前有时间工作......?或者我还需要在那里添加几秒钟吗?因为那会很烦人...

以上是关于向订阅主题的所有用户推送通知,使用 FCM Firebase 的登录用户除外的主要内容,如果未能解决你的问题,请参考以下文章

fcm 订阅主题

如何不向不想接收推送的用户发送 FCM?

Flutter 按主题使用 FCM 推送通知

Firestore 更改后使用 FCM 发送推送通知? [复制]

您如何向从应用程序本身订阅主题的用户发送 Firebase 推送通知

从 Lambda 向订阅主题的所有用户发送 SNS 通知