簡體   English   中英

Firebase 功能解決方案,用於構建具有 Seen 功能的安全聊天應用程序

[英]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 個問題是:

  1. 如果我要調用一個雲 function 來獲取消息並以某種方式將它們標記為已讀,那會破壞我的應用程序,因為我需要一個連續的 stream 實時消息數據來使聊天感覺良好,我不能 stream 來自雲 function。
  2. 我想創建一個不是寫密集型的系統。 如果我必須特別用一些“seenOn:timestamp”值標記每個消息文檔,這意味着如果用戶正在閱讀 200 條新消息,則每個文檔上有 200 條新寫入,這對我來說似乎太多了,有應該是另一種方式。

我正在尋求有關如何使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM