Подтвердить что ты не робот

Обнаружение, если соединение Firebase потеряно/восстановлено

Существует ли стратегия, которая будет работать в рамках текущего предложения Firebase, чтобы определить, потеряно ли и/или восстановлено соединение с сервером?

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

4b9b3361

Ответ 1

Это обычно запрашиваемая функция, и мы только что выпустили обновление API, чтобы вы это сделали!

var firebaseRef = new Firebase('http://INSTANCE.firebaseio.com');
firebaseRef.child('.info/connected').on('value', function(connectedSnap) {
  if (connectedSnap.val() === true) {
    /* we're connected! */
  } else {
    /* we're disconnected! */
  }
});

Полные документы доступны на https://firebase.google.com/docs/database/web/offline-capabilities.

Ответ 2

Обновлено: Для многих функций, связанных с присутствием, полезно, чтобы клиент знал, когда он находится в сети или в автономном режиме. Клиенты базы данных Firebase Realtime предоставляют специальное место в /.info/connected, которое обновляется каждый раз при изменении состояния подключения клиента. Вот пример:

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    boolean connected = snapshot.getValue(Boolean.class);
    if (connected) {
      System.out.println("connected");
    } else {
      System.out.println("not connected");
    }
  }

  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});

Ответ 3

Думаю, это изменилось за последние пару месяцев. В настоящее время инструкции находятся здесь: https://firebase.google.com/docs/database/web/offline-capabilities

В суммировании:

var presenceRef = firebase.database().ref("disconnectmessage");
// Write a string when this client loses connection
presenceRef.onDisconnect().set("I disconnected!");

а также:

var connectedRef = firebase.database().ref(".info/connected");
connectedRef.on("value", function(snap) {
  if (snap.val() === true) {
    alert("connected");
  } else {
    alert("not connected");
  }
});

Я признаю, что не знаю много о том, как устанавливаются ссылки, или что это значит (вы делаете их из воздуха или вы должны их заранее создать?) Или какой из них вызовет что-то на сервере, в отличие от чего-то на переднем конце, но если ссылка по-прежнему актуальна, когда вы читаете это, может понадобиться немного больше чтения.

Ответ 4

Для android вы можете onDisconnect() пользователя только одной функцией, называемой onDisconnect()

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

DatabaseReference presenceRef = FirebaseDatabase.getInstance().getReference("USERS/24/online_status");

presenceRef.onDisconnect().setValue(0);

При отключении от сети Здесь я делаю online_status 0 пользователя, Id которого равен 24 в firebase.

getReference("USERS/24/online_status") - это путь к значению, которое необходимо обновить в автономном режиме/онлайн.

Вы можете прочитать об этом в автономных возможностях

Обратите внимание, что для выполнения функции onDisconnect() функция firebase занимает около 2-10 минут.

Ответ 5

Предлагаемое решение не сработало для меня, поэтому я решил проверить соединение, написав и прочитав значение "здоровье/проверка". Это код:

const config = {databaseURL: 'https://${projectName.trim()}.firebaseio.com/'};
//if app was already initialised delete it
if (firebase.apps.length) {
    await firebase.app().delete();
}
// initialise app
let cloud = firebase.initializeApp(config).database();
// checking connection with the app/database
let connectionRef = cloud.ref('health');
connectionRef.set('check')
    .then(() => {
        return connectionRef.once("value");
    })
    .then(async (snap) => {
        if (snap.val() === 'check') {
            // clear the check input
            await connectionRef.remove();
            // do smth here becasue it works
    }
});

enter image description here