允许用户在消息应用中同时向多个用户发送消息

Posted

技术标签:

【中文标题】允许用户在消息应用中同时向多个用户发送消息【英文标题】:Allow users to send messages to multiple users simultaneously in a messaging app 【发布时间】:2018-07-29 12:09:37 【问题描述】:

如何在消息应用程序中同时向多个朋友发送一条消息?我在一个 Django question 中读到这个设计是一个 M2M 关系。您定义了 2 个模型(User 和 SentMessage),后端创建了第三个对象?

例如,微信和 Facebook Messenger 允许您选择多个朋友并同时向他们发送一条消息。这是如何在 ios、Parse 或您自己的 Node.js 后端完成的?

你定义你的类。

user["username"] = String
user["sex"] = String
user["age"] = Int

///

let messageObj = PFObject(className: "Messages")   
messageObj["sender"] = PFUser.current()?.username
messageObj["message"] = messageTextView.text
messageObj["likes"] = [String]()

您如何允许将消息发送到: A. 所有用户同时进行。 B. 具有特定属性的用户,例如["age"] 或 ["sex"] 同时进行。

随时为其他服务器贡献解决方案。

【问题讨论】:

【参考方案1】:

在 Firebase 中,您还可以使用第三个“表”对多对多关系进行建模,您可以在其中将实体 1 中的项目连接到实体 2 的项目。有关更多信息,请参阅Many to Many relationship in Firebase

但对于聊天应用程序,我通常会以不同的方式对这个用例进行建模。向一组用户发送消息通常会在这些应用程序中启动一个临时聊天室。如果其中一位用户回答,则该回答将发送给组中的其他所有人。因此,您实际上已经启动了一个临时聊天室,由其中的人员识别。

我通常建议在 Firebase 中以参与者的名字命名这个临时聊天室。有关这方面的更多信息,请参阅:http://***.com/questions/33540479/best-way-to-manage-chat-channels-in-firebase。在该模型中,如果您和我开始聊天,我们的房间将是:uidOfMat_uidOfPuf。所以我们的 JSON 看起来像:

chats: 
  "uidOfMat_uidOfPuf": 
    -Labcdefgh1: 
      sender: "uidOfMat",
      text: "How is a single message sent to several friends simultaneously in messaging applications?"
    
    -Labcdefgh2: 
      sender: "uidOfPuf",
      text: "In Firebase you model many-to-many relationships with a third "table" too..."
    

由于聊天室是由参与者定义的,所以无论何时你和我聊天,我们都会在同一个聊天室中结束。很方便!

现在假设我通过将某人拉入聊天来寻求帮助来回答您的问题。由于聊天室由其参与者定义,因此添加新参与者会创建一个新聊天室:uidOfMat_uidOfPuf_uidOfThird。所以我们最终得到:

chats
  uidOfMat_uidOfPuf
    -Labcdefgh1: 
      sender: "uidOfMat",
      text: "How is a single message sent to several friends simultaneously in messaging applications?"
    
    -Labcdefgh2: 
      sender: "uidOfPuf",
      text: "In Firebase you model many-to-many relationships with a third "table" too..."
    
  
  "uidOfMat_uidOfPuf_uidOfThird": 
    -Labcdefgh3: 
      sender: "uidOfPuf",
      text: "Hey Third. Puf here. Mat is wondering how to send a single message to several friends simultaneously in messaging applications. Do you have an idea?"
    
    -Labcdefgh4: 
      sender: "uidOfThird",
      text: "Yo puf. Long time no see. Let me think for a moment..."
    

这里有几点需要注意:

在我们目前使用的模型中,如果我们将另一个人添加到 uidOfMat_uidOfPuf_uidOfThird 聊天室,则会再次创建一个新的聊天室。

许多聊天应用程序让您可以选择命名群组聊天室。在许多情况下,将用户添加到此类命名的聊天室确实可以让他们访问消息历史记录。我倾向于将此类房间称为永久聊天室,因为它们可以访问历史聊天消息。

在上面的示例中,假设我们将 1:1 房间命名为“model_chat_room”。这意味着将第三个人添加到房间中,可以让他们立即访问我们的消息历史记录。

一方面很方便,因为我不必重复您的问题。另一方面,马特也可以看到我们的整个对话历史。许多人认为 1:1 聊天对话是私密的,这就是为什么“永久聊天室”模型通常只适用于与 3 个或更多参与者的命名聊天。

【讨论】:

谢谢。我查了微信。你是对的。在微信中,您有一个触发“新聊天”的按钮。然后在该窗口中,您可以选择所有或部分用户。当您单击完成时,它会开始群聊。如果它是公司自己的服务器而不是 Firebase 或 Parse,会有什么不同?在 iOS 中如何处理?目标是向网络中所有具有任何[“属性”](例如 30 岁)的用户“广播”一条消息,然后他们可以回复。想象一下发送推送通知但用户可以在可操作通知中回复的 SOS 广播。

以上是关于允许用户在消息应用中同时向多个用户发送消息的主要内容,如果未能解决你的问题,请参考以下文章

使用用户的UID发送Firebase云消息

Android 自动消息发送

您能否确定是不是可以使用 discord.py 直接向用户发送消息?

通知:向所有下载我的应用程序的人发送消息

聊天应用 - Socket.io - 我如何向其他用户显示消息?

尝试向多个不和谐服务器发送消息