Unity开发iOS游戏运行一周后启动闪退无法打开问题求助
崩溃原因定位
- 崩溃触发源为
firebase::firestore::csharp::TransactionManagerInternal::ExecuteCallbackFromMainThread,是Firebase Firestore的C#层事务回调执行时抛出了未捕获的异常,被IL2CPP全局未处理异常处理器捕获后触发崩溃。 - 安装后一周才触发的核心逻辑:Firebase Firestore默认开启本地离线持久化,未提交成功的事务会在本地缓存最多7天,到期后SDK会强制清理并触发失败回调,若业务代码未在事务回调链路中做异常捕获,就会抛出未处理异常直接导致程序退出。
修复步骤
- 全链路捕获Firestore事务异常
给所有RunTransactionAsync相关的逻辑、成功/失败回调添加异常捕获,不要让任何异常从事务逻辑中抛出,示例代码:
try { await FirebaseFirestore.DefaultInstance.RunTransactionAsync(async transaction => { // 原有事务读写逻辑 }); } catch (Exception e) { // 自行处理异常,比如打印日志、走降级逻辑,禁止向上抛出未捕获异常 UnityEngine.Debug.LogError($"Firestore事务执行失败:{e.Message}\n{e.StackTrace}"); }
升级Firebase Firestore SDK版本
如果你使用的是8.x及更低版本的Firebase SDK,该版本存在已知的事务回调线程调度、空引用bug,升级到官方最新LTS版本即可修复SDK层面的异常问题。排查第三方SDK调用线程安全
检查事务逻辑中是否调用了Appodeal、GameAnalytics的相关接口,这类广告、统计SDK的大部分接口要求只能在Unity主线程调用,若在事务回调的工作线程中调用会触发未捕获异常,需要将这类调用统一抛到Unity主线程执行。可选调整缓存策略
如果不需要7天的离线事务持久化能力,可以手动调整Firestore的缓存配置,避免过期事务触发异常:
var firestoreSettings = new FirebaseFirestoreSettings(); firestoreSettings.PersistenceEnabled = true; // 可设置为无上限缓存,或者自定义缓存大小阈值 firestoreSettings.CacheSizeBytes = FirebaseFirestore.CacheSizeUnlimited; FirebaseFirestore.DefaultInstance.Settings = firestoreSettings;
验证方法
直接将测试设备的系统时间调整为安装时间7天之后,启动应用即可复现崩溃场景,修复后再次验证即可确认问题是否解决。
内容的提问来源于stack exchange,提问作者Hossein Eslami
相关产品推荐
相关产品推荐

