我正在使用具有某些游戏类型功能且需要两个用户都在线使用的Firebase Real-time数据库实现一个通讯应用程序。考虑到用户A
和B
正在通信,并且只有A
处于联机状态(B连接到Firebase实时数据库),B
才可以执行某些操作。我该如何实施?
我已经尝试过的东西
我有一个名为user/user_id/online
的节点。每当我更新
数据库在线,我在使用onDisconnect
函数断开连接时将其删除。
此逻辑的问题是Firebase服务器无法执行onDisconnect
逻辑,直到服务器端套接字超时为止
时间超过一分钟(即使在发生互联网错误时致电goOffline也要花费一分钟以上),但就我而言,只有1到3
秒延迟是允许的。
我有一个名为user/user_id/last_online
的节点,并对其进行过一次更新
每隔2秒,用户A
将继续检查用户B's
最后一次
采取任何行动之前的在线时间。这种逻辑的问题是,这将大大提高数据下载速率。
最佳答案
您似乎已经拥有内置基元(即Firebase的状态系统)的最佳方法。不过,在onDisconnect
上有一个注释:检测脏连接(应用程序崩溃,网络连接丢失等)只需要很长时间。在完全断开连接(应用已关闭)的情况下,onDisconnect
应该几乎立即触发。
如果onDisconnect
的行为方式不足以满足您的需求,则需要在应用程序中实现其余功能。
首先想到的是主动保持活动,这似乎是您在#2中已经使用的保持活动。假设您希望等待的时间最多为3秒,那么2秒的保持活动ping似乎是一个合理的间隔。
这确实会增加带宽使用率。考虑到您的用例和平台的工作方式,我看不到其他实现方式。