我想在我的应用程序中集成一个公共聊天室,但是我对如何创建后端毫无头绪。
我为我的应用程序使用firebase,两个用户或一组用户之间的设置很简单。我根据Firebase中的参考点创建了一个私人会议室,允许该群组中的用户访问这些消息。
现在我要说我在洛杉矶,我希望用户能够与距其位置1英里半径范围内的其他用户聊天(lat / lng)。我知道它可能,因为有一个应用程序可以在https://itunes.apple.com/sg/app/popcorn-messaging/id718416705?mt=8找到它。
如果您想知道我尝试过的内容,请阅读以下内容。这可能有点令人困惑。
我想到这样做的一种方法是在全世界创建一个英里间距的聊天室。例如,从lat:0,lng:0开始,然后向右移动一英里,然后向右移动一英里等等。但是这样做弊大于利。我将有数百万个聊天室而不是全部使用过。
我认为可以实现的第二种方法是创建一个聊天室,如果它不存在于用户半径内。因此,如果我在洛杉矶,并且没有聊天室,它会在该位置创建一个并且让我们说如果另一个人去了洛杉矶,因为已经在1英里的位置创建了一个聊天室,它将加载聊天室那个用户。
任何建议都将不胜感激。
答案 0 :(得分:5)
如果你确定你希望它是1英里乘1英里或任何类型的设定距离,我认为世界上预定的聊天室有一英里间距是更好的选择。就添加新用户而言,当人们移动位置时避免重叠,这将更加简单。如果你正在使用firebase,并且你正确地展平你的数据,那么你就不会因空房而伤害自己。
我可能不会这样做的唯一原因是你担心聊天室会变得太满或太空。我不确定这是否是您的应用程序的问题,但这肯定是具有预定义位置的缺点。即使这样,您也可以根据房间内的人数使用预定义的位置并缩小(拆分房间)或按比例放大(合并房间)。
希望这会有所帮助。如果您正在寻找更多方向,您能告诉我们更多关于您的申请吗?
更新:我明白你在说什么。经过进一步思考,我仍然认为预定的区域是最好的方式。即使你自发地创造了新的区域,你仍然需要打破房间(画出房间之间的界限)和那条线两边的用户,即使它们彼此相邻,也会在不同的房间。
如果它仅基于纬度/经度和这些用户周围的半径,那么最终结果也可能是奇数结果。例如,如果用户B在具有用户A和C的房间中,但是用户A和C彼此相距太远,则他们可能会看到一些非常奇怪的聊天消息。例如,如果该半径为1英里,则User A
可能位于Mile 0
,User B
可能位于Mile 1
,User C
可能位于Mile 2
}}。所以User A
(只能看到User A
和User C
)的聊天可能如下所示:
User A: Hello there! What is 2+2?
User B: 4
User A: Thank you!
User B: George Washington
User A: What?!?!
致User B
(谁是唯一会看到所有消息的人),它可能如下所示:
User A: Hello there! What is 2+2?
User B: 4
User A: Thank you!
User C: Who was the first president of the United States?
User B: George Washington
User C: Thank you!
User A: What?!?!
致User C
(只能看到User B
和User C
),它可能如下所示:
User B: 4
User C: Who was the first president of the United States?
User B: George Washington
User C: Thank you!
这似乎很快就会失控。毕竟,我认为我的原始建议仍然是最好的,但我认为所有这些建议都会有挑战。祝你好运!
答案 1 :(得分:2)
我会这样做:
从概念上讲,聊天室是用户列表。
你可以做的是计算一个聊天室"当他/她登录时为每个用户提供。正如@Luke指出的那样,您将获得地理半径和最小/最大用户数的边界。
这些所谓的聊天室(实际上是附近用户的列表)可能会根据某些用户签名(IP +用户代理)进行缓存
有一些复杂性,并且有重叠的房间,但是您可以在每次登录时通过根据新用户到达时的在线用户进行重新计算来处理。
您可以限制计算,即使用半径为300的用户,然后计算半径为100的接近度
另一种方法:您可以构建用户的Voronoi图,并将给定用户的相邻区域显示为聊天邻居