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

检测Firebase连接是否丢失/恢复,firebase,Firebase,在当前Firebase产品中是否有一种策略可以检测服务器连接是否丢失和/或恢复 我正在考虑移动设备的一些脱机意外情况,我希望有一种可靠的方法来确定Firebase数据层何时可用。这是一个常见的请求功能,我们刚刚发布了一个API更新来让您做到这一点 var firebaseRef = new Firebase('http://INSTANCE.firebaseio.com'); firebaseRef.child('.info/connected').on('value', function(co

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


我正在考虑移动设备的一些脱机意外情况,我希望有一种可靠的方法来确定Firebase数据层何时可用。

这是一个常见的请求功能,我们刚刚发布了一个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! */
  }
});
完整文档可在以下位置获得:

更新: 对于许多与状态相关的功能,客户机了解其在线或离线状态非常有用。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");
  }
});
我想这在过去的几个月里发生了变化。目前的说明如下:

总之:

var presenceRef=firebase.database().ref(“disconnectmessage”);
//当此客户端失去连接时写入字符串
presenceRef.onDisconnect().set(“I disconnected!”);
以及:

var connectedRef=firebase.database().ref(“.info/connected”);
connectedRef.on(“值”,函数(捕捉){
if(snap.val()==真){
警报(“已连接”);
}否则{
警报(“未连接”);
}
});

我承认,我不太清楚引用是如何设置的,或者这意味着什么(你是凭空创建的还是你必须事先创建它们?),或者哪一个引用会触发服务器上的某个东西而不是前端上的某个东西,但是如果读到这篇文章时链接仍然是最新的,多读一点可能会有帮助。

对于android,只需一个名为
onDisconnect()

我在我的一个聊天应用程序中做到了这一点,如果网络连接丢失或用户与互联网断开连接

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

presenceRef.onDisconnect().setValue(0);
在这里断开与网络的连接时,我正在对firebase中Id为24的用户进行
联机\u状态
0

getReference(“用户/24/online\u状态”)
是您需要在脱机/联机时更新的值的路径

你可以在报纸上读到


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

建议的解决方案对我不起作用,因此我决定通过写入和读取“health/check”值来检查连接。代码如下:

const config={databaseURL:`https://${projectName.trim()}.firebaseio.com/`};
//如果应用程序已经初始化,请删除它
if(firebase.apps.length){
等待firebase.app().delete();
}
//初始化应用程序
让cloud=firebase.initializeApp(config.database();
//正在检查与应用程序/数据库的连接
让connectionRef=cloud.ref('health');
connectionRef.set('检查')
.然后(()=>{
返回connectionRef.once(“值”);
})
。然后(异步(快照)=>{
如果(snap.val()=='check'){
//清除检查输入
等待连接ref.remove();
//在这里做smth,因为它可以工作
}
});



迈克尔,非常感谢。您的团队似乎总是领先一步。另一个问题是,当您确实希望连接保持正常,但您的服务器出现故障时……它不会尝试请求新连接,而是反复尝试重新连接到“故障”服务器(嘿@Shawn,很遗憾,这是目前预期的行为。对于给定的Firebase,客户端必须连接到特定的服务器。如果服务器宕机,我们可以将Firebase移动到其他服务器,但这是一个手动过程,因此您将看到客户端尝试连接到宕机服务器的一段时间。您可以ect这种行为(以及正常运行时间)将在未来几个月内有所改善。这很公平。感谢您的跟进。:)您好,这段代码仍然相关吗?当我用
setInterval
测试它时,我收到了一个接一个的“已连接”和“未连接”答案。我的意思是,我先得到的是“未连接”,但过了一秒钟它就切换到“已连接”,为什么?Firebase是一个NoSQL JSON数据存储,所以它没有模式。因此,你可以从稀薄的空气中挑选它们,设定一个值,然后它们就存在了:)老实说。。。在使用了8年的SQL之后,我花了相当长的时间才了解NoSQL。。。但它确实很棒。我用的是同样的东西。但当用户失去互联网连接时,它就不起作用了。@Nirmalsinh:这个答案已经有两年多的历史了。这可能不再是做这件事的方式了。如果您尝试了此处发布的所有答案,但这些答案都不起作用,您可以发布一个新问题,详细说明您的情况,并解释所有这些问题都不起作用。您好,我一直在尝试将Firebase添加到我的项目中,我总是收到“未连接”的提示。知道怎么回事吗?这里也一样。有什么建议吗?这是给安卓的platform@Waza_Be如果您在聊天应用程序中添加google-services.json,而聊天应用程序需要显示即时更改,并且正如您所说,firebase需要2-10分钟执行
onDIsconnect(),则必须将您的项目的google-services.json添加到app文件夹中,以使此工作正常(Android解决方案)
那么您如何管理用户状态。@androidXP实际上,这可能是Firebase的问题,更新状态有时需要10分钟。因此,依赖firebase在线-离线状态,我们需要立即更改状态,这是否好?我没有找到其他更好的解决方案,可以在用户关闭wifi/移动数据时更新在线/离线状态。没有互联网连接时,我们如何更新状态!!若用户按下“后退”按钮或“主页”按钮,它将向其他用户显示脱机状态,或者显示为“离开”,但若如您所说需要2-10分钟,则可能会在用户之间造成混淆。谢谢你的回复
firebase.database().ref(".info/connected").on("value",(snap)=> {});