首次安装时的Firebase永久数据库

时间:2020-01-14 14:18:31

标签: firebase unity3d firebase-realtime-database

我当前在Unity中开发的应用程序使用启用了数据库持久性的Firebase实时数据库。这非常适合离线使用应用程序(例如在无信号的区域)。

但是,如果新用户在没有互联网连接的情况下首次运行该应用程序,则该应用程序将冻结。我猜是因为它需要第一次关闭数据库才能使持久性发挥作用。

我知道诸如“ Detect if Firebase connection is lost/regained”之类的线程正在讨论如何处理与Firebase的数据库断开连接。

但是,无论如何,我是否可以检查它是否是用户第一次使用该应用程序(例如,通过持久数据库的存在?)。然后我可以通知他们,他们必须在线才能进行“首次设置”?

2 个答案:

答案 0 :(得分:0)

Firebase数据库API中没有任何东西可以检测是否已填充其离线缓存。

但是您可以检测到何时建立数据库连接,例如通过listening to the .info/connected node。然后,将第一个设置为true时,您可以在本地存储中设置本地标志,例如在PlayerPrefs中。

使用此代码后,您可以检测是否在PlayerPrefs中设置了该标志,如果未设置,则向用户显示一条消息,告知他们需要网络连接才能下载初始数据。

答案 1 :(得分:0)

除了@ frank-van-puffelen的答案以外,我认为Firebase RTDB本身不会导致您的游戏在网络连接出现之前锁定。如果您的游戏可在没有网络连接的情况下首次启动时进行播放(即:您的逻辑本身不需要网络的某些初始状态),则可能需要检查以下问题:

确保您可以处理null。如果您的游戏逻辑位于Coroutine中,则Unity可能会决定静默停止它,而不是完全失败。

如果您通过Transactions与数据库进行交互,则通常假定它将运行两次(一次对本地缓存,如果值不同,则在与服务器同步缓存时再次运行)。这意味着您第一次通过交易执行更改时,可能会具有null的先前状态。

如果可以的话,更喜欢听ValueChanged而不是GetValueAsync。您将始终在Unity主线程上获得此回调,始终在向本地缓存中的数据注册时获得一次回调,并且数据将在服务器更新时定期更新。此外,如果看到@ frank-van-puffelen answer elsewhere,则如果您使用的是GetValueAsync,则可能无法获得预期的数据(如果用户处于脱机状态,则为null)。如果您的游戏因等待ContinueWithOnMainThread(除非您有理由不愿意,在Unity中总是ContinueWith)或await语句而被冻结,则可能{{1} }也可以解决此问题(我认为情况并非如此)。

再次检查对象的生存期。应用程序可能冻结的原因有很多,但是在处理异步逻辑时,一定要确保您了解Unity的GameObject生命周期与C#的典型对象生命周期(see this post和我自己的{{3 }}。如果在调用ValueChangedOnDestroyawait之前调用对象ContinueWith[OnMainThread],则有在自己的代码中遇到空引用的危险。如果场景发生变化,调用ValueChanged之后的帧或紧随Destroy之后的帧,则会发生这种情况。

最后,许多Firebase函数具有DestroyImmediate和同步变体(例如:AsyncCheckDependencies)。我认为没有适当的实时数据库调用方法,但是如果您使用函数的非异步变体(或者您在完成任务时自旋锁住,包括忘记在协程中CheckDependenciesAsync),游戏肯定会冻结一段时间。请记住,任何云产品都受到自然的I / O约束,并且通常会比游戏的更新循环运行得慢(尽管Firebase会尽其所能尽快地运行)。

我希望这会有所帮助!

-帕特里克