70

是否有一种策略可以在当前的 Firebase 产品中起作用,以检测服务器连接是否丢失和/或重新获得?

我正在考虑移动设备的一些离线突发事件,我想要一种可靠的方法来确定 Firebase 数据层何时可用。

4

6 回答 6

95

这是一个普遍要求的功能,我们刚刚发布了一个 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获得。

于 2012-07-05T20:12:08.203 回答
16

更新: 对于许多与状态相关的功能,客户端知道它何时在线或离线很有用。Firebase 实时数据库客户端在 /.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");
  }
});
于 2016-08-24T19:40:33.647 回答
7

我想这在过去几个月里发生了变化。目前的说明在这里: 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");
  }
});

我承认我不太了解参考是如何设置的,或者这意味着什么(您是凭空制作它们还是必须事先创建它们?)或者其中哪一个会触发某些事情在服务器上而不是在前端,但是如果在您阅读本文时链接仍然是最新的,那么阅读更多内容可能会有所帮助。

于 2016-11-16T13:13:51.350 回答
3

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

我在我的一个聊天应用程序中执行此操作,如果网络连接丢失或用户与 Internet 断开连接,用户需要自动离线

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

presenceRef.onDisconnect().setValue(0);

在与网络断开连接时,我online_status在 Firebase 中将 ID 为 24 的用户设为 0。

getReference("USERS/24/online_status")是您需要离线/在线更新的值的路径。

您可以在离线功能中了解它

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

于 2018-01-20T11:13:37.390 回答
2

网络火力基地

firebase.database().ref(".info/connected").on("value",(snap)=> {});
于 2019-10-23T13:21:12.420 回答
1

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

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

在此处输入图像描述

于 2018-06-27T09:18:51.823 回答