为什么我需要在Firebase中订阅用户到主题?

3
我想要实现聊天功能。例如用户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)) {

您能解释一下使用订阅的优势吗?如果我们无论如何都需要表示用户消息列表,为什么还需要订阅呢...

如果我表达得不够清楚,请随时提问。

2个回答

3

使用Firebase Cloud Messaging发送消息有很多方法,从文档中,你可以发送到

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

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

  • 应用程序不必处理注册令牌。如果您使用这些令牌,则必须在某处存储它们,为它们提供查找等。当然可能性很大,但是使用主题使文章变得更短。
  • 如果同一用户在多个设备上安装了聊天应用程序,则他们将在每个设备上接收通知

以及这些缺点:

在聊天应用中,用户已经拥有一个唯一的昵称,因此这提供了一个简单的用户可见值来映射到话题。如果你、Veener和我在聊天中,将会有三个话题:/topics/user_aleksey/topics/user_veener/topics/user_puf。每当你或Veener在聊天中提到我时,通知将被推送到/topics/user_puf。有许多映射到话题的方法,哪种方法最好取决于您的应用程序。

我将完成这个实现,并希望您确认我的最终理解...用户A向用户B发送消息。消息保存在FCM数据库中,立即服务器脚本捕获此消息,读取收件人并向其发送带有主题名称的通知。那么用户B连接到这个主题,对吗?最后一个问题是 - 这个主题名称必须是唯一的,是否有一些开箱即用的方法来做到这一点? - Sirop4ik
你似乎认为主题比它们实际上更神奇。它只是一个发布/订阅模型。如果你向主题发布通知,那么所有订阅该主题的用户都会收到通知。 - Frank van Puffelen

1

发布/订阅在有大量客户端的情况下非常有用。比如,你有一个天气应用程序,并想向居住在特定城市的所有人推送像龙卷风这样的天气警报。你可以将一条消息发布到该城市的主题上(该消息将传递给所有订阅该城市的人),或者你可以向每个居住在该城市的人发送成千上万条消息,遍历所有用户并发送许多个体消息。哪种方法似乎更容易实现和交付?


好的,谢谢!我理解你的观点了。但是如果我理解正确的话,如果我需要实现聊天并从一个特定用户发送消息到另一个用户,我不需要使用订阅概念,对吗? - Sirop4ik
正确。您不需要使用发布/订阅来进行点对点消息传递。 - Veener
你有尝试过使用Firebase吗?因为据我所知,一个用户创建一个主题,另一个用户可以在已存在的主题中读写帖子,只要他知道名称(唯一标识符)...如果其他人也知道主题的名称,他也可以读/写,并且Firebase会立即在所有知道主题名称的人之间同步它。无论是与两个用户的聊天还是具有1000个订阅者的天气警告,都没有关系...不同之处仅在于权限,您可以像管理员一样,只发布您的帖子,或者所有用户都将获得写入权限,看起来像聊天,对吧? - Sirop4ik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接