描述
应用程序在被用户终止后2~5秒出现崩溃(即强制终止应用程序(。这种情况仅发生在基于多个统一版本的iOS构建上(请参阅下面的详细信息(。大多数崩溃报告都没有到达Crashlytics。控制台上很少发生崩溃,尽管我们每天都在不断地重复这个错误。Android版本不会出现相同的错误。
复制步骤
- 打开游戏
- 等待加载场景即将完成或游戏场景完全加载
- 终止应用程序
- 等待2-5秒,然后查看碰撞报告窗口
- 繁殖率:80%
- 用于测试的设备:iPhone SE、iPhone 7、iPhone 8、iPad Mini 4
- 还观察到崩溃:iPhone XS,iPhone XR
其他信息
- 问题是iOS特有的。我们在安卓系统上有相同的构建,可以毫无问题地工作
- Crashlytics在大多数情况下都没有捕捉到碰撞报告(请参阅下面的一些碰撞(
- 崩溃只发生在加载的最后一步,在那里初始化外部SDK
- 在TestFlight上,几乎所有构建的崩溃计数都是0,包括用户报告崩溃的构建
- 使用调用Unity的Application.Quit((方法的调试按钮不会导致应用程序崩溃,即使需要一段时间才能关闭
- 崩溃似乎与操作系统版本和iOS设备无关
技术信息
- Unity版本:2019.2.17f1。也与2019.2.0f1和2019.3.10f1一起复制
- 此处列出了外部插件
- 崩溃报告
- GUID.cpp第108行
- libc++abi.dylib
- 字符串.h行195
- 音频工具箱
探索
以下是迄今为止未成功的所有解决方案尝试的列表:
- 删除GameAnalytics插件
- 删除IronSource插件
- 删除UnityEAP插件
- PostProcess iOS上的变通方法
- 将最低操作系统版本设置为9.0
- 注释所有OnApplicationPause/Quit实现(包括插件(
- 启用比特码
解决方案
描述:通常的问题是,在应用程序完成时,任何一段代码都会阻塞iOS上的主线程(有关更多信息,请参阅本文档(。在我们的例子中,当玩家杀死应用程序时,它是由于正在进行的请求而发生的。当应用程序终止(使用Dispose()
方法(时,当我们在服务器上保存播放器进度时,请求阻塞了主线程,导致崩溃。解决方案是删除此特定保存。我们测试了包括这个修复程序在内的构建,到目前为止,在加载游戏场景后,我们在20次尝试杀死游戏时没有崩溃。我们以前没有想过这一点,因为这段代码自2019年8月以来就在那里,从那时起就没有人碰过它。这个问题直到2020年2月才开始出现。
更多信息:由于这段有问题的代码自2019年8月以来就存在于该项目中,而问题仅在2020年2月才开始发生,因此iOS版本可能与此有关。我们尚未调查更改日志,但迄今为止出现崩溃的最旧iOS版本是2019年10月28日发布的iOS 13.2。
另一种可能是后端代码的一些更改导致请求挂起。当我们使用BestHTTP时,默认情况下,当应用程序终止时,所有请求都会中止。我们还没有调查Dispose
与OnDisable/OnApplicationQuit
的执行顺序是否会成为问题。此外,默认情况下,BestHTTP在Application Quit期间中止的请求仍会调用回调。在我们的例子中,Save Player的回调是null
,所以这可能不是问题所在。
相关崩溃:我们在装载场景中仍面临一些崩溃。据我们所见,它们发生在有请求的情况下。这些问题的再现率远低于游戏场景中的问题。
提示:我们很难在Crashlytics上检索日志,因为大多数日志都没有发送。以下是如何从iOS设备本身检索日志的步骤:
- 在iPhone/iPad设备上打开设置应用程序
- 转到隐私(在iOS 13上显示在电池下方(
- 滚动到底部并打开Analytics&改进
- 打开分析数据
- 查找所需应用程序的日志