Обнаружение, если соединение Firebase потеряно/восстановлено
Существует ли стратегия, которая будет работать в рамках текущего предложения Firebase, чтобы определить, потеряно ли и/или восстановлено соединение с сервером?
Я рассматриваю некоторые автономные непредвиденные ситуации для мобильных устройств, и я бы хотел получить надежное средство для определения того, когда доступен уровень данных Firebase.
Ответы
Ответ 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]()