繁体   English   中英

Unity Firebase RTDB 在构建后不起作用

[英]Unity Firebase RTDB doesn't work after building

Unity版本2020.3.22f1, Firebase SDK 9.0.0 do.net4

我已经导入了分析和实时数据库 SDK。分析工作非常好。

关于数据库,构建一个 Android 应用程序包并上传到内部测试或构建一个 APK 并直接上传到我的手机或构建 IOS 并上传到试飞所有 3 个结果都有错误。

这就是我初始化 Firebase 的方式-

FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
    //init analytics
    FirebaseAnalytics.SetAnalyticsCollectionEnabled(true);

    DatabaseReference = FirebaseDatabase.DefaultInstance.RootReference;
    Debug.Log(JsonConvert.SerializeObject(DatabaseReference.Database.App.Options));
});

这就是我使用数据库的方式(增加特定级别的获胜字段)-

DatabaseReference.Child("Levels").Child($"Level{levelNum}").Child("Wins").RunTransaction((mutableData) =>
{
    mutableData.Value = Int32.Parse(mutableData.Value.ToString()) + 1;
    return TransactionResult.Success(mutableData);
});

参考上面DatabaseRefrence初始化中的日志,在编辑器中,我可以看到所有配置属性 - databaseUrl、apikey、AppId 等...

在我的手机上调试 APK Options 属性只包含 databaseUrl。 当尝试对数据库执行事务时,会抛出错误 -

W/Unity: Exception in transaction delegate, aborting transaction
    System.NullReferenceException: Object reference not set to an instance of an object.
    at ....(Firebase.Database.MutableData mutableData)

到目前为止我尝试过的事情-

  1. 我已经添加了我的调试密钥库和谷歌控制台应用程序完整性的 SHA1/SHA256
  2. 我已经检查过,XML 文件正在streamingAssets文件夹和Assets\Plugins\Android\FirebaseApp.androidlib\res\values\google-services.xml中成功生成所有详细信息
  3. 我已经尝试按照此处所述手动初始化 Firebase 应用程序 - https://stackoverflow.com/a/66874818/7210967 ,这样做确实会导致上面的 debug.log 包含所有选项参数,但会出现相同的错误,就像它实际上并没有使用它。 (我已经尝试过使用适当的配置文件并完全删除它们)。
  4. 我试过覆盖默认的应用程序实例选项。

我读过一些帖子说 Proguard 混淆可能会导致 firebase 错误? 找不到与 Unity 相关的任何内容。

如果有人有任何想法,请分享!

Firebase 实时数据库中的事务的工作方式与您预期的略有不同,因为它们会立即根据客户端对节点当前值的猜测调用您的处理程序,通常为null

因此,当您在代码中调用mutableData.Value时,您会返回null ,然后对其调用ToString() ,这会导致出现错误。 要解决此问题,请先检查mutableData.Value是否为null ,然后再对其调用方法。

int current = mutableData.Value is null ? 0 : Int32.Parse(mutableData.Value.ToString());
mutableData.Value = current + 1;
return TransactionResult.Success(mutableData);

上面可能有语法错误,因为我已经有一段时间没写 C# 了。


交易将 SDK 猜测和您基于该猜测的新值发送到服务器,然后执行比较和设置操作。 如果猜测与数据库中的实际值不匹配,服务器将拒绝使用当前值的写入,然后客户端使用更新的当前猜测再次调用您的事务处理程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM