我正在使用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
最后一次
采取任何行动之前的在线时间。这种逻辑的问题是,这将大大提高数据下载速率。答案 0 :(得分:1)
您似乎已经拥有内置基元(即Firebase的状态系统)的最佳方法。不过,在onDisconnect
上有一个注释:检测脏连接(应用程序崩溃,网络连接丢失等)只需要很长时间。在完全断开连接(应用已关闭)的情况下,onDisconnect
应该几乎立即触发。
如果onDisconnect
的行为不足以满足您的需求,则需要在应用程序内部实现其余的功能。
首先想到的是主动保持活动,这似乎是您在#2中已经使用的保持活动。考虑到您最多希望3秒钟的延迟,因此2秒的保持连接ping似乎是一个合理的间隔。
这确实会增加带宽使用率。考虑到您的用例和平台的工作方式,我看不到其他实现方式。