【问题标题】:Firebase OnDisconnect EventFirebase OnDisconnect 事件
【发布时间】:2020-11-27 02:58:12
【问题描述】:

所以问题是关于 firebase 中的 onDisconnect,我在颤振和使用 Firebase 中实现了一个类似 whatsapp 的聊天应用程序,此时卡住了 onDisconnect 事件需要 2-3 分钟才能在您无法访问互联网时触发:

  1. 我知道这需要很多时间,因为它正在等待套接字超时以指定用户已完全断开连接

  2. 我尝试使用goOffline,但没有成功,至少我想让onDisconnect 事件被更快地触发。

  3. 我有一个解决方法,通过使计时器颤动,并且每个 X 周期我更新一个时间戳,表明该用户还活着,但问题是当他离线时谁会触发该用户的离线状态?云功能,还是其他在线连接用户?由于该用户在 X 周期内没有回复,因此我们需要将他的状态更新为离线。

  4. 这个问题有解决办法吗?

提前致谢。

我正在使用的示例代码: 在initState()我正在听/.info/connected

 FirebaseDatabase.instance
        .reference()
        .child('/.info/connected')
        .onValue
        .listen((data) {
      print('bool value');
      print(data.snapshot.value);
      if (data.snapshot.value == false) {
        //user dc
        print('user disconnected');
        FirebaseDatabase.instance.goOffline().then((value) => print("offline"));
      } else {
        print('user reconnected');
        FirebaseDatabase.instance.goOnline().then((value) => print("user online again"));
        FirebaseDatabase.instance.reference().child('uid').onDisconnect().set({'status': 'offline'}).then((value) => print('here I am '));
      }
    });


【问题讨论】:

    标签: firebase flutter firebase-realtime-database


    【解决方案1】:

    如果服务器端onDisconnect 不适合您的用例,那么常见的方法确实是实现您自己的机制。您提出的 keep-alive 方法仍然需要仲裁器来确定连接何时失效。这绝对是可能的,但通常需要 Cloud Function 或更永久的侦听器。

    我通常会为每个用户/连接添加一个lastSeenTimestamp,而不是这样,然后让为每个人读取这些时间戳的客户端在考虑用户陈旧之前确定他们希望连接有多新鲜。

    在这种情况下,您仍然可以使用onDisconnect 来清理数据,但您不再受制于服务器的套接字超时间隔来将用户标记为在您的客户端中处于非活动状态。

    【讨论】:

    • 是的,关于那个解决方案,已经这样做了,想要更令人满意(精确)的结果......谢谢弗兰克:)
    • 所以,无论如何都会使用 onDisconnect(关闭应用程序、注销等)仍然有用,并且客户端检查其他 lastseen(时间戳)来处理没有互联网连接......听起来不错。跨度>
    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 2014-08-04
    • 2016-11-04
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多