检测 Firebase 连接是否丢失/恢复

是否有一种策略可以在当前的 Firebase 提供中检测服务器连接是否丢失和/或恢复?

我正在考虑一些移动设备的离线意外情况,我想要一个可靠的方法来确定什么时候 Firebase 数据层可用。

68572 次浏览

这是一个常见的要求功能,我们刚刚发布了一个 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下载。

对于许多与在线状态相关的特性,客户端知道它是在线还是离线是很有用的。Firebase 实时数据库客户端在/提供一个特殊位置。每次客户端的连接状态改变时都会更新 info/connect。这里有一个例子:

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

我猜在过去的几个月里这种情况有所改变,现在的说明是这样的: 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");
}
});

我承认,我对参考文献是如何设置的,或者这意味着什么(你是凭空创造出来的,还是你必须事先就已经创造出来了?)知之甚少或者哪一个会触发服务器上的某些东西,而不是前端的某些东西,但如果链接仍然是最新的,当你阅读本文时,多一点阅读可能会有帮助。

对于 android,你可以通过一个称为 onDisconnect()的函数使用户离线

我这样做在我的聊天应用程序之一,用户需要自动脱机,如果 网络连接中断或用户 断开与互联网的连接

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


presenceRef.onDisconnect().setValue(0);

关于从网络断开这里我使用户的身份证为24的 online_status0在 Firebase。

getReference("USERS/24/online_status")是您需要在脱机/联机上更新的值的路径。

你可以在 离线功能上读到

请注意,firebase 执行 onDisconnect ()函数需要大约2-10分钟的时间。

建议的解决方案对我不起作用,所以我决定通过写入和读取“ health/check”值来检查连接。这是密码:

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

网络火库网络火库

firebase.database().ref(".info/connected").on("value",(snap)=> {});