Есть ли способ заставить систему присутствия базы данных Firebase в реальном времени обнаруживать разъединение быстрее - PullRequest
1 голос
/ 10 июня 2019

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

Я пробовал рекомендованный метод подпискина .info / подключен в БД реального времени, а также обновляет БД пожарного хранилища.

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'));
      });

Как только Интернет отключен, БД в реальном времени обнаруживает отключенного пользователя, я хотел бы этогоможет быть максимум 10 секунд.

1 Ответ

2 голосов
/ 10 июня 2019

Клиент может отключиться двумя способами:

  • чистое отключение, при котором клиент сообщает серверу, что он исчезает.

  • грязное разъединение, при котором клиент исчезает и сервер должен определить это условие.

Для чистых отключений определенные вами записи onDisconnect будут выполняться немедленно.

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

Если вам нужен более быстрый способ определить, какие клиенты все еще подключены, вы можете записать подтверждение активности в базе данных. По сути: каждые 10 секунд пишите значение часового для каждого клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...