[英]Firebase functions solution for building a secure Chat App with Seen functionality
我正在使用 Flutter 和 Firebase 構建一個聊天應用程序。
它在 Firebase Firestore 中的工作方式非常簡單,我只有一個 conversationId 代表有消息的文檔,所有用戶都有他們的對話列表,當他們點擊對話時,會彈出一個新屏幕他們看到的消息基於 conversationId 文檔下“消息”集合的 stream 中的數據。 基本上就是這樣的結構
col: Chats
doc: conversationId
col: Messages
message documents...
這就是我在聊天屏幕中獲取消息的方式。
_firestore
.collection("Chats")
.doc(_messageCollectionId)
.collection("Messages")
.orderBy("sentOn", descending: true)
.snapshots()
.map(...)
消息文檔基本上是消息文本以及發送時間和發送者。
我想創建“看到”的功能,本質上我希望用戶看到他閱讀或不閱讀的對話(哪些有新消息,如 instagram 聊天或不和諧)
我想不出一個好的解決方案,我的主要 2 個問題是:
我正在尋求有關如何使用 Firebase 進行此類聊天的架構的指導 go。也許我的聊天 model 並不真正適合我的需要,我應該如何調整它?
另一個問題是我不知道應該如何發送“看到”的信號。 如果我手動寫入文檔並從我的客戶端更改某些“isRead”字段的 boolean 值,客戶端可以輕松跳過該行代碼並破壞我的整個可見系統,他們可以讀取消息而無需發送可見信號斷點。 這是很容易被利用的,文檔“onRead”上沒有雲 function 觸發器可以幫助我將該邏輯移到客戶端之外,那么使它也安全的解決方案是什么?
所以如果你想創建看到的 function 你可以先讓數據庫結構看起來像這樣
您應該為數據庫創建 2 個集合,用戶集合只會保存用戶數據,並且在 uid 內的chats
集合中保存的聊天室 ID 看起來像這樣
那是用戶內部的集合。 僅放置用戶嘗試向其他用戶發送新消息時建立的連接的 roomId。 把這個領域完全像那樣。 之后你可以創建一個像這樣的聊天室集合
確保chats
集合中的隨機 uid 是您應該在 users/doc/chats/ 集合中注冊的房間 ID。 roomId 內的字段將是 2 個用戶之間的連接,用於訪問已發送到 db 的消息。 在chat
集合中,您將以這種格式發送消息數據
在你放置之后,你可以使用 stream function 檢索聊天數據,看起來像這樣
Stream<QuerySnapshot<Map<String, dynamic>>> streamChats(String chatId) {
CollectionReference chats = firestore.collection("chats");
return chats.doc(chatId).collection("chat").orderBy("time").snapshots();
}
每次用戶發送消息時,您都可以將已發送給其他用戶的消息總數放在 total_unread 字段中,並在其他用戶打開聊天室 ID 時更新它。 你看到的 tada 可以正常工作
哦,您可以創建一個 function 來檢查 total_unread 是否已經為 0,並且您可以將已查看/檢查圖標放在用戶消息氣泡旁邊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.