【问题标题】:How to use FCM topics for notification in chat app?如何在聊天应用中使用 FCM 主题进行通知?
【发布时间】:2019-05-27 03:49:17
【问题描述】:

我正在使用 Flutter 和 Firestore 后端制作聊天功能。

每条消息都是 Firestore 集合中的新文档,带有 UID 和文本字段。聊天是 1:1 且随机的,因此在进入聊天之前不知道用户会与谁交谈。聊天集合中的DocID都是auto-id。

我已阅读可以使用主题来管理发送通知。这应该比使用单个设备 fcm 令牌更容易。

有人知道如何为这个随机的 1:1 聊天应用实现使用主题吗?

【问题讨论】:

  • 您确定主题会更容易吗?主题消息听起来不太适合一对一消息。主题的整个想法是向所有监听该主题的许多设备广播消息。令牌消息传递的整个想法是将消息发送到一个设备(用户)。
  • 我有兴趣看到这种方法,因为我已经读过这是可能的。也许更容易,因为不需要在 db 中维护令牌
  • 我想这是可能的,但您仍然必须为每个用户存储一些内容,以标识向其他用户发送消息的唯一主题。你也可以像往常一样存储令牌。

标签: firebase google-cloud-firestore firebase-cloud-messaging google-cloud-functions


【解决方案1】:

您绝对可以为每个 1:1 对话使用单独的主题,例如使用我在此处描述的命名方案:Best way to manage Chat channels in Firebase。但是,正如 Doug 在他的评论中已经指出的那样,有一些事情需要考虑,这会导致大多数开发人员不仅仅将 FCM 用于他们的聊天应用程序。

例如:FCM 主题不安全。这意味着任何找到主题 ID 的人都可以订阅它,从而偷听 1:1 对话。虽然您可以生成难以猜测的主题,但您不应依赖不知道主题 ID 作为一种安全机制。

另一个考虑替代方案的原因是 FCM 消息是暂时的:一旦它们被传递,就不再有任何痕迹。使用您当前的 Firestore 实现,您可以查询数据库以获取要显示的所有消息,而使用纯 FCM 实现,您将必须构建自己的数据库(如果您的应用程序需要)。

出于这些原因,我所知道的大多数聊天应用程序都使用 FCM(用于推送通知)和在线数据库(用于持久性)作为后端服务的组合。

【讨论】:

  • 感谢您的回复!如果使用单独的 FCM 令牌(不是主题),则必须从客户端在 Firestore 中更新每个用户令牌。由于令牌已刷新但客户端应用程序未更新 Firestore 中的字段,因此未发送通知是否没有问题?例如,如果有网络问题
【解决方案2】:

我发现弗兰克关于“排序的用户 ID 组合键”的评论非常有趣。我可能会使用它作为数据库中的聊天键(实时/firestore),但是,对于通知,我认为我仍然会为每个用户使用一个主题 - 这样我就可以避免通知发布消息的用户.如果这不是问题,那么每个聊天室只选择一个主题。

另外提到弗兰克,我可能会在所有主题名称中使用额外的键,以使它们很难猜到。 (但稍后再添加,这样您就不会被非核心内容分心)

In this answer 您有一个示例,说明如何使用 onCreate 触发器将通知发布到主题(来自函数后端)。

在flutter代码中,你可以使用firebase_messaging插件中的subscribeToTopic来开始收听一个话题。

注意:如果您的应用支持用户注销 [可能会:)],那么您还必须delete the token in the device 以避免收到上次登录用户的通知。

【讨论】:

  • 谢谢!!您在生产应用程序中使用它吗?我对你的经历很感兴趣。例如 Firebase 文档说:“主题消息针对吞吐量而不是延迟进行了优化”。您是否遇到过延迟?
猜你喜欢
  • 1970-01-01
  • 2017-09-23
  • 2021-08-23
  • 2021-09-07
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
相关资源
最近更新 更多