c# - Firebase 统一 : How to handle no internet connection situations

标签 c# firebase unity3d firebase-realtime-database

我想做什么

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

我的问题是什么

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

我尝试过的

1)

DatabaseReference connectedRef = FirebaseDatabase.DefaultInstance.GetReference(".info/connected");
    connectedRef.ValueChanged += (object sender, ValueChangedEventArgs a) => {
    bool isConnected = (bool)a.Snapshot.Value;
    Debug.Log(isConnected);
};

当用户在游戏过程中失去互联网连接时不会触发,所以我无法捕捉到没有互联网连接的异常

2)

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

我认为在 firebase 连接上设置超时是目前唯一的解决方案,但这也行不通 Debug.Log("timeout"); 当没有互联网时从不记录连接。

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

最佳答案

编辑:

以下代码在我的机器上确实可以在 MacOS 上的 Unity SDK 6.15.1 和 6.13 编辑器中工作:

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

虽然进入“无连接”状态可能需要一些时间(例如,当您关闭 WiFi 时它不会立即触发)但会立即响应 GoOffline()GoOnline .

总结评论:

.info/connected" 在 iOS 和 Android SDK 中实现,因此可在设备上使用。在 Unity 编辑器中测试时,重新实现了 platform specific backend SDKs written in C++而是使用没有完全实现的特殊节点,例如 ".info/connected"(从 6.15.1 开始)。要测试与实时数据库当前连接状态相关的逻辑,您必须部署到物理设备。

此外,尝试以主要依赖 ValueChanged 的方式设计您的游戏读取数据和RunTransaction写入数据。这将使您在各种网络条件下具有弹性,并有助于加强您的游戏以应对竞争条件,如果您需要它们以进行快速测试,这些将在 Unity 编辑器中发挥作用。

关于c# - Firebase 统一 : How to handle no internet connection situations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62723721/

相关文章:

c# - 复制前锁定整个字典或部分字典 (SyncRoot)

ios - 如何在 swift iOS Firestore 中获取帖子单元格 documentId?

unity3d - 没有足够的空间来安装 Unity

c# - DownloadProgressChangedEventHandler 多久被调用一次

c# - Dynamics 365 - 使用 IOrganizationService 创建 OrganizationServiceProxy

c# - 不同用途的类别

javascript - 如何在 firebase 中添加 SignOut 选项

Android Firebase - .setPersistenceEnabled(true) 时启动时间缓慢

c# - 如何在游戏对象上动态设置随机 Material

c# - 如何在 unity 3d 5 中连接 sqlite 数据库?(无插件)