公共聊天室与半径使用Firebase(征求意见)



我想在我的应用程序中集成一个公共聊天室,但是我对如何创建后端一无所知。

我在我的应用程序中使用firebase,两个用户或一组用户之间的设置很简单。我基于Firebase中的参考点创建了一个私人房间,该房间允许该组中的用户访问消息。

现在假设我在洛杉矶,我希望用户能够与距离他们位置(lat/lng) 1英里半径内的其他用户聊天。我知道这是可能的,因为有一个应用程序,可以在https://itunes.apple.com/sg/app/popcorn-messaging/id718416705?mt=8找到这一点。

如果你想知道我尝试了什么,请阅读以下内容。

我想到的一种方法是在世界各地创建一个聊天室,间隔一英里。例如,从lat:0, lng:0开始,然后向右移动一英里,然后再向右移动一英里,等等,但这样做弊大于利。我将拥有数百万个聊天室,但不是所有的都被使用。

我认为我可以实现的第二种方法是创建一个聊天室,如果它不存在于用户半径内。如果我在洛杉矶,没有聊天室,它会在那个位置创建一个,假设另一个人去洛杉矶因为一个聊天室已经在1英里的位置创建了,它会为那个用户加载聊天室。

如果你确定你想要1英里乘1英里或任何类型的设置距离,我认为世界各地的预定义聊天室间隔一英里是更好的选择。只要添加新用户并避免人们移动位置时的重叠,这就会简单得多。如果您正在使用firebase,并且您正确地平铺了您的数据,那么使用空房间不会对您造成太大的伤害。

我可能不这样做的唯一原因是如果你担心聊天室变得太满或太空。我不确定这对您的应用程序是否有影响,但这肯定是预定义位置的一个缺点。即使这样,您也可以使用预定义的位置,并根据房间中的人数缩小(分开房间)或扩大(合并房间)。

希望这对你有帮助。如果你在寻找更多的方向,你能告诉我们更多关于你的申请吗?

更新:我明白你的意思了。经过进一步思考,我仍然认为预先确定的区域是最好的选择。即使你自发地创造了新的区域,你仍然需要打破房间(在房间之间画出界限),并且在这条线的任何一边的用户,即使他们彼此相邻,也会在不同的房间里。

如果它只是基于lat/lng和这些用户周围的半径,那最终也可能会得到奇怪的结果。例如,如果用户B与用户a和C在一个房间里,但是用户a和C相距太远,他们可能会看到一些非常奇怪的聊天消息。例如,如果半径是1英里,User A可能在Mile 0, User B可能在Mile 1, User C可能在Mile 2。因此,对于User A(只能看到User AUser 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 BUser C),它可能看起来像这样:

User B: 4
User C: Who was the first president of the United States?
User B: George Washington
User C: Thank you!

看起来这可能会很快失去控制。综上所述,我认为我最初的建议仍然是最好的,但我认为所有这些都将面临挑战。好运!

我会这样做:

从概念上讲,聊天室是一个用户列表。

你能做的是为每个用户计算一个"聊天室",当他/她登录。正如@Luke所指出的,你应该对地理半径和最小/最大返回用户数量有一些限制。

这些所谓的聊天室(实际上是附近用户的列表)可能会基于某些用户签名(IP+用户代理)缓存

有一些复杂性,有重叠的房间,但你在每次登录时都会根据新用户到达时在线的人进行重新计算。

你可以限制计算,比如让用户在半径为300的范围内然后计算半径为100的范围内的接近度

另一种方法:您可以构建用户的Voronoi图,并为给定用户提供相邻区域作为聊天邻居

参考:https://en.wikipedia.org/wiki/Voronoi_diagram

最新更新