我正在建立一个聊天应用程序使用Flutter和Firebase。
Firebase Firestore中的工作方式非常简单,我只有一个conversationId,它表示包含消息的文档,所有用户都有一个对话列表,当他们点击一个对话时,会弹出一个新屏幕,在那里他们可以看到基于conversationId文档下的“Messages”集合流中的数据的消息。基本上就是这样的结构
col: Chats
doc: conversationId
col: Messages
message documents...
这就是我如何在聊天屏幕中获得消息。
_firestore
.collection("Chats")
.doc(_messageCollectionId)
.collection("Messages")
.orderBy("sentOn", descending: true)
.snapshots()
.map(...)
消息文档基本上是消息文本以及发送时间和发送者。
我想创建“seen”功能,本质上我想让用户看到他读过或没有读过的对话(哪些有新消息,比如Instagram聊天或不和谐)
我不能想出一个很好的解决办法,我的主要问题是:
1.如果我调用一个云函数来获取消息并以某种方式将其标记为已读,这将打破我的应用程序,因为我需要一个连续的实时消息数据流来让聊天感觉良好,我不能从云函数中流数据。
1.我想创建一个写操作不密集的系统,如果我必须用某个“seenOn:timestamp”值来标记每个消息文档,这意味着如果用户正在阅读200条新消息,则每个文档上有200个新写操作,这对我来说太多了,应该有另一种方法。
我在寻求指导,告诉我应该如何使用Firebase构建这样的聊天系统。也许我的聊天模型并不适合我的需要,我应该如何调整它?
另一个问题是我不知道“seen”信号应该如何发送。如果我手动写入一个文档,并从我的客户端更改一些“isRead”字段的布尔值,客户端可以很容易地跳过那行代码,并破坏我的整个seen系统,他们可以阅读消息而不发送seen信号,只是使用一个断点。这是相当容易利用的,在文档“onRead”上没有云函数触发器可以帮助我将逻辑移到客户端之外,那么什么解决方案可以使它也安全呢?
1条答案
按热度按时间au9on6nz1#
因此,如果您想创建seen函数,可以将数据库结构设置为如下所示的第一个x1c 0d1x
您应该为数据库创建2个集合,users集合将仅保存用户数据,而在uid内部的
chats
集合中,保存的聊天室ID将如下所示那是用户内部的集合.当用户试图发送一个新消息给其他用户时,只放连接的roomId.放字段看起来像那样.在那之后你可以创建一个看起来像
的聊天室集合
要确保
chats
集合内的随机uid是您应该在users/doc/chats/ collection中注册的房间id。roomId内的字段将是2个用户之间的连接,用于访问已发送到数据库的消息。在chat
集合内,您将以发送消息数据
输入之后你就可以用流函数来检索聊天数据了,看起来像这样
每次用户发送消息时,你可以把已发送给其他用户的消息的总数放在total_unread字段中,并在其他用户打开聊天室ID时更新它。并且tada你看到的可以正常工作
哦,你可以创建一个函数来检查total_unread是否已经为0,你可以把seen/check图标放在你的用户消息气泡旁边。