C# Firebase Unity:如何处理无互联网连接的情况

C# Firebase Unity:如何处理无互联网连接的情况,c#,firebase,unity3d,firebase-realtime-database,C#,Firebase,Unity3d,Firebase Realtime Database,我想做什么 我有一个Unity的小游戏,我在firebase实时数据库中存储了一个用户分数,以在以后显示排行榜,当用户第一次进入游戏时,我也会询问用户名并用deviceId保存它(以识别设备)。所以现在我想处理用户没有连接到internet的情况,我想将数据存储在设备中,当用户获得连接或再次进入游戏时,我将更新firebase实时数据库中的数据 我的问题是什么 这里的问题是firebase不会抛出任何没有连接的异常,它只是一直尝试连接到internet,直到有连接为止。您可能建议在用户进入游戏时

我想做什么

我有一个Unity的小游戏,我在firebase实时数据库中存储了一个用户分数,以在以后显示排行榜,当用户第一次进入游戏时,我也会询问用户名并用deviceId保存它(以识别设备)。所以现在我想处理用户没有连接到internet的情况,我想将数据存储在设备中,当用户获得连接或再次进入游戏时,我将更新firebase实时数据库中的数据

我的问题是什么

这里的问题是firebase不会抛出任何没有连接的异常,它只是一直尝试连接到internet,直到有连接为止。您可能建议在用户进入游戏时检查互联网连接,但我也希望在以下情况下处理此问题:例如,用户将从互联网连接开始,并假设在游戏期间用户将失去互联网,如果发生这种情况,我希望将数据存储在设备中,如上所述。因此,我需要捕捉没有互联网连接的情况,以便能够在设备中存储数据

我尝试过的

(一)

当用户在游戏过程中失去互联网连接时不会触发,因此我无法捕获任何互联网连接异常

(二)

我认为在firebase连接上设置超时是目前唯一的解决方案,但这不太管用
Debug.Log(“timeout”)没有internet连接时从不记录

我一直在寻找解决方案,只找到了这两个似乎可行的答案,但运气不好,我没有主意,不知道如何解决这个问题。期待您的帮助,谢谢。

编辑:

在MacOS上的Unity SDK 6.15.1和6.13编辑器中,以下代码在我的机器上运行:

FirebaseDatabase.DefaultInstance.GetReference(".info/connected").ValueChanged += HandleConnectedChanged;
FirebaseDatabase.DefaultInstance.GetReference(".info/serverTimeOffset").ValueChanged += HandleServerTimeOffsetChanged;
虽然可能需要一些时间才能进入“无连接”状态(例如,当您关闭WiFi时不会立即触发),但会立即响应和

总结评论:

“.info/connected”
在iOS和Android SDK中实现,因此可在设备上使用。在Unity编辑器中进行测试时,将使用的重新实现,它没有完全实现特殊节点,例如
“.info/connected”
(从6.15.1开始)。要测试与实时数据库当前连接状态相关的逻辑,必须将其部署到物理设备


此外,尝试以一种主要依赖于读取数据和写入数据的方式设计游戏。这将使您在各种网络条件下具有弹性,并有助于加强您的比赛对抗比赛条件,如果您需要Unity Editor进行快速测试,这些功能将在Unity Editor中发挥作用。

您可以在尝试向数据库提交数据时进行检查,而不是检查连接。如果连接未启动,则返回的任务将使属性IsFaulted为true。请看:您能告诉我您在哪个平台上看到这种行为吗?例如,如果只在编辑器中测试,则可能是特定于编辑器的错误。还要注意的是,读取/写入仍然在脱机状态下成功是RTDB持久性特性的一个特性。如果使用ValueChanged侦听器读取数据并使用事务进行写入,则通常可以忽略数据库的连接状态(您将首先命中缓存,事务将允许您在发生冲突时重播更改)@RyanJMcGowan不,如果没有互联网,它永远不会开火connection@PatrickMartin嗯,是的,我认为这可能是相关的,我只在编辑器中测试过,我的目标平台是Android和IOS,你能告诉我这些平台应该使用哪种解决方案吗?在这种情况下,尝试构建设备并使用
“.info/connected”
以监视连接。如果它在设备上工作,请在此处提交问题:。基本上在iOS和Android上,C++(Unity)SDK回落到java和ObjsSDK。在桌面(在编辑器)中,它是用C++实现的100%,这样的特性可能没有使它成为(实际上,它可能只被设置为false:但是我不太熟悉这个特性,以肯定地说)你知道这对FiSt店也适用吗?
Task timeoutTask = Task.Delay(1000);
Task firebaseConnection = await database.Child("users").GetValueAsync();
if (await Task.WhenAny(firebaseConnection, timeoutTask) == firebaseConnection) {
    Debug.Log("timeout");
} else {
    Debug.Log("completed");
}
FirebaseDatabase.DefaultInstance.GetReference(".info/connected").ValueChanged += HandleConnectedChanged;
FirebaseDatabase.DefaultInstance.GetReference(".info/serverTimeOffset").ValueChanged += HandleServerTimeOffsetChanged;
private void HandleServerTimeOffsetChanged(object sender, ValueChangedEventArgs e)
{
    Debug.Log($"Offset: {e.Snapshot.Value}");
}

private void HandleConnectedChanged(object sender, ValueChangedEventArgs e)
{
    Debug.Log($"Connected: {e.Snapshot.Value}");
}