firebase - 有没有办法让 firebase 实时数据库存在系统更快地检测到断开连接

标签 firebase firebase-realtime-database flutter google-cloud-firestore

我正在创建一个 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 秒。

最佳答案

客户端可以通过两种方式断开连接:

  • 完全断开连接,客户端让服务器知道它正在消失。

  • 脏连接,客户端消失,由服务器检测这种情况。

对于完全断开连接,您定义的 onDisconnect 写入将立即运行。

脏断开取决于套接字超时,这意味着您的 onDisconnect 写入可能需要几分钟才能发生。对于此行为您无能为力,因为它是套接字工作方式的固有部分。

如果你想要一个更快的方法来检测哪些客户端仍然连接,你可以在数据库中写一个保持事件状态。本质上:每 10 秒从每个客户端写入一个标记值。

关于firebase - 有没有办法让 firebase 实时数据库存在系统更快地检测到断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59512300/

相关文章:

java - 使用 android Geofire 获取经度和纬度

python - Firebase python,访问用户数据

reactjs - 使用 onCreate() 读取 firebase 数据库

flutter - 将int内置到内置函数中不会改变骰子的图像,但是当将其移到@override之上时,骰子图像会发生变化。为什么?

flutter - 警报对话框中的值不会从外部更新

flutter - 如何使 adobe XD 生成的代码成为 flutter 插件,根据屏幕尺寸实际可用和响应?

swift - 如何异步使用 Firebase?数据库读取给出奇怪的结果

Firebase 命令行列出 GCP firebase 中的函数

javascript - 按值而不是键对 react native 对象列表进行排序

firebase - 我可以向我的 Firebase 托管静态网站添加其他文件,还是每次都必须部署整个网站?