我正在创建一个Flutter应用程序,至关重要的是几乎立即检测到一个用户从实时/ Firestore数据库中脱机并通知其他用户。
我尝试了在实时数据库中订阅.info / connected的推荐方法,并且还更新了Firestore数据库。
FirebaseDatabase.instance
.reference()
.child('.info')
.child('connected')
.onValue
.listen((data) {
if (data.snapshot.value == false) {
// Internet has been disconnected
setState(() {
state.connected = false;
});
userFirestoreRef.updateData({
'status': 'offline',
'lastChanged': FieldValue.serverTimestamp(),
});
}
userDbRef.onDisconnect().update({
'status': 'offline',
'lastChanged': ServerValue.timestamp
}).then((_) async {
// This resolves as soon as the server gets the request, not when the user disconnects
setState(() {
state.connected = true;
});
await userDbRef.update({
'status': 'online',
'lastChanged': ServerValue.timestamp,
}).catchError((e) => debugPrint('Error in realtime db auth, $e'));
await userFirestoreRef.updateData({
'status': 'online',
'lastChanged': FieldValue.serverTimestamp(),
}).catchError((e) => debugPrint('Error in firestore auth, $e'));
});
一旦互联网关闭,实时数据库大约需要1.5分钟才能检测到用户已断开连接,我希望此时间最多为10秒。
答案 0 :(得分:2)
客户端可以通过两种方式断开连接:
干净的断开连接,客户端让服务器知道它正在消失。
肮脏的断开连接,客户端消失了,由服务器来检测这种情况。
对于完全断开连接,您定义的onDisconnect
写操作将立即运行。
肮脏的断开连接取决于套接字超时,这意味着您的onDisconnect
写操作可能要花费几分钟。对于这种行为,您无能为力,因为它是套接字工作方式的固有部分。
如果想要更快的方法来检测仍在连接的客户端,则可以在数据库中编写一个保持活动状态。本质上:每10秒钟从每个客户端写入一个哨兵值。