Событие Firebase OnDisconnect - PullRequest
       84

Событие Firebase OnDisconnect

0 голосов
/ 06 августа 2020

, поэтому вопрос касается onDisconnect в firebase, я реализую chatapp, например, whatsapp в трепете, и использую Firebase, застрял в этой точке, событие onDisconnect запускается через 2-3 минуты, когда у вас нет доступа inte rnet :

  1. Я знаю, что это занимает столько времени, потому что он ожидает тайм-аута сокетов, чтобы указать, что пользователь полностью отключился

  2. I пытался использовать 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 '));
      }
    });


1 Ответ

0 голосов
/ 06 августа 2020

Если серверная onDisconnect не подходит для вашего варианта использования, общий подход действительно заключается в реализации вашего собственного механизма. Предложенный вами подход keep-alive все еще нуждается в арбитре, чтобы определить, когда соединение не работает. Это определенно возможно, но обычно требуется облачная функция или более постоянный слушатель.

Вместо этого я обычно добавляю lastSeenTimestamp для каждого пользователя / соединения, а затем имею клиентов, которые их читают временные метки для всех определяют, насколько sh они хотят, чтобы соединение было, прежде чем считать, что пользователь устарел.

Вы все равно можете использовать onDisconnect в этом случае для очистки данных, но вы больше не привязаны к интервалу тайм-аута сокета сервера, чтобы пометить пользователя как неактивного в ваших клиентах.

...