You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity开发iOS游戏运行一周后启动闪退无法打开问题求助

崩溃原因定位
  • 崩溃触发源为firebase::firestore::csharp::TransactionManagerInternal::ExecuteCallbackFromMainThread,是Firebase Firestore的C#层事务回调执行时抛出了未捕获的异常,被IL2CPP全局未处理异常处理器捕获后触发崩溃。
  • 安装后一周才触发的核心逻辑:Firebase Firestore默认开启本地离线持久化,未提交成功的事务会在本地缓存最多7天,到期后SDK会强制清理并触发失败回调,若业务代码未在事务回调链路中做异常捕获,就会抛出未处理异常直接导致程序退出。
修复步骤
  1. 全链路捕获Firestore事务异常
    给所有RunTransactionAsync相关的逻辑、成功/失败回调添加异常捕获,不要让任何异常从事务逻辑中抛出,示例代码:
try
{
    await FirebaseFirestore.DefaultInstance.RunTransactionAsync(async transaction =>
    {
        // 原有事务读写逻辑
    });
}
catch (Exception e)
{
    // 自行处理异常,比如打印日志、走降级逻辑,禁止向上抛出未捕获异常
    UnityEngine.Debug.LogError($"Firestore事务执行失败:{e.Message}\n{e.StackTrace}");
}
  1. 升级Firebase Firestore SDK版本
    如果你使用的是8.x及更低版本的Firebase SDK,该版本存在已知的事务回调线程调度、空引用bug,升级到官方最新LTS版本即可修复SDK层面的异常问题。

  2. 排查第三方SDK调用线程安全
    检查事务逻辑中是否调用了Appodeal、GameAnalytics的相关接口,这类广告、统计SDK的大部分接口要求只能在Unity主线程调用,若在事务回调的工作线程中调用会触发未捕获异常,需要将这类调用统一抛到Unity主线程执行。

  3. 可选调整缓存策略
    如果不需要7天的离线事务持久化能力,可以手动调整Firestore的缓存配置,避免过期事务触发异常:

var firestoreSettings = new FirebaseFirestoreSettings();
firestoreSettings.PersistenceEnabled = true;
// 可设置为无上限缓存,或者自定义缓存大小阈值
firestoreSettings.CacheSizeBytes = FirebaseFirestore.CacheSizeUnlimited;
FirebaseFirestore.DefaultInstance.Settings = firestoreSettings;
验证方法

直接将测试设备的系统时间调整为安装时间7天之后,启动应用即可复现崩溃场景,修复后再次验证即可确认问题是否解决。

内容的提问来源于stack exchange,提问作者Hossein Eslami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:36:01