用于私人消息传递的Firebase数据库结构

时间:2017-11-02 10:07:43

标签: ios swift firebase firebase-realtime-database

是否有一种简单的方法来构建在两个用户之间具有消息传递的数据库。在firebase-database中你可以指向相同的东西吗? 我希望能够在两个用户下进行对话的伪复制。这样,user1具有他正在与之进行对话的人的列表,并且用户2也是如此,并且对话信息仅需要存储一次。在写这篇文章时,我可能已回答了我自己的问题,但这些是我正在考虑的两种选择。第2块似乎更节省空间。有没有人对如何处理这个问题有任何其他建议。

第1块:每次在两个用户下发送一条消息。

{
    messaging:
        user1:
            user2:
                message1: 
                    messageBody: "text"
                    sender: "user1"
                message2: 
                    messageBody: "text"
                    sender: "user2"
                message3: 
                    messageBody: "text"
                    sender: "user1"
        user2:
            user1:
                message1: 
                    messageBody: "text"
                    sender: "user1"
                message2: 
                    messageBody: "text"
                    sender: "user2"
                message3: 
                    messageBody: "text"
                    sender: "user1"

}

或替代方案 Block2:每次发送邮件时都会将其存储在该会话参考下,但每个用户都会引用该会话。

{
    conversations:
        conversation1:
            message1: 
                messageBody: "text"
                sender: "user1"
            message2: 
                messageBody: "text"
                sender: "user2"
            message3: 
                messageBody: "text"
                sender: "user1"
pairs:
    user2:
        user1:
            conversationName: "conversation1"
    user1:
        user2:
            conversationName: "conversation1"

}

有没有办法在数据库中说,无论孩子的顺序如何,都指向同一个东西?因此,第二行和第三行将引用相同的内容:

let dbRef = FIRDatabase.database().reference().child("messages")
let user1MessagesRef = dbRef.child("user1").child("user2")
let user2MessagesRef = dbRef.child("user1").child("user2")

1 个答案:

答案 0 :(得分:0)

我正在开发一款使用Firebase的iOS开源聊天应用程序,我遇到了同样的问题。

我的问题是时间戳没有被设置为相同的值,因此我创建了一个Firebase云功能,用于克隆从会话到用户数据的消息。

我的数据库布局方式如下:

chats:
    chatID: (Which is both users' IDs separated by an '&' character)
        messages:
            childAutoID1:
                message: "message body"
                timestamp: server timestamp value.
                userID: the id of the user who sent the message
            childAutoID:
                message: "message body"
                timestamp: server timestamp value.
                userID: the id of the user who sent the message
userData:
    userID1:
        userID2:
            message: "Last message"
            timestamp: latest message timestamp
            userID: latest message user id
    userID2:
        userID1:
            message: "Last message"
            timestamp: latest message timestamp
            userID: latest message user id

首先,我将消息填充到移动应用程序的3个位置:聊天/聊天ID /消息,userData / userID1 / userID2,以及userData / userID2 / userID1 但我的问题是他们没有获得相同的时间戳,因为在每个节点填充值的时间之间存在微小的延迟。这就是我创建云功能的原因,该功能将聊天/聊天ID /消息中的消息复制到其他2个位置。

这是指向云功能文件的链接:https://github.com/Tawa/TNChat/blob/master/Firebase/functions/index.js

也许它并不完全符合您的需求,但我希望它可以帮助您解决问题。

该项目仍未记录,我计划在未来几天内对其进行记录。

编辑:忘记提及云功能还向收件人的设备发送静默通知。检查AppDelegate以查看它是如何处理的。 :)