为什么我需要让用户订阅 Firebase 中的主题?

Why do I need to subscribe user to topic in Firebase?

我想实现聊天功能。例如用户 A、B、C... 每个用户都可以互相发送消息,这是标准的 whatsup...

并且根据 this article ,当一个用户向另一个用户发送消息时,我必须为他们订阅一个主题。

例如用户A发送消息给用户B,服务器创建一个主题testTopicName并用这行代码订阅他们这个主题

FirebaseMessaging.getInstance().subscribeToTopic(testTopicName);

但问题是,如果我可以下一步,为什么我需要订阅用户主题:

从服务器向用户发送通知,并带有主题的名称或唯一 ID 用户通过从服务器

检索到的主题的唯一 ID 打开这个新主题

这是文档中的代码

 mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage,
            MessageViewHolder>(
            FriendlyMessage.class,
            R.layout.item_message,
            MessageViewHolder.class,
            mFirebaseDatabaseReference.child(testTopicName)) {

你能解释一下使用订阅有什么好处吗,否则我们无论如何都需要表示用户消息列表...

如果我解释得不够清楚,请随时问我

如果您有很多客户,

Publish/subscribe 很有用。假设您有一个天气应用程序,并想向居住在特定城市的每个人推送龙卷风等天气警告。您可以向该城市的主题发布一次消息(该消息将发送给订阅该城市的每个人),或者您可以向居住在该城市的每个人发送数千条消息,循环遍历所有用户并发送许多个人消息。哪一个似乎更容易实施和交付?

有很多方法可以定位使用 Firebase 云消息传递发送的消息。来自 documentation, you can send to:

  • 主题名称
  • 设备注册令牌
  • 设备组名

在这篇文章中,我决定将每个用户与一个主题相关联。这样做有以下优点:

  • 应用程序不必 deal with registration token。如果您使用这些标记,则必须将它们存储在某个地方,为它们提供查找等。这一切都是可能的,但使用主题会使文章更短。
  • 如果同一用户在多台设备上都有聊天应用程序,他们将在每台设备上收到通知

还有这些缺点:

  • 每个用户都需要有一个唯一的用户名。
  • 消息不是私人的(参见

在聊天应用程序中,用户已有一个唯一的昵称,因此这提供了一个简单的用户可见值来映射到主题。如果你、Veener 和我在聊天,就会有三个话题:/topics/user_aleksey/topics/user_veener/topics/user_puf。每当你或 Veener 在聊天中提到我时,通知将被推送到 /topics/user_puf

映射到主题的方法有很多种。哪种方式最好取决于您的应用程序。