(Unity 2019.2)iOS版本在应用程序被用户杀死5秒后崩溃



描述

应用程序在被用户终止后2~5秒出现崩溃(即强制终止应用程序(。这种情况仅发生在基于多个统一版本的iOS构建上(请参阅下面的详细信息(。大多数崩溃报告都没有到达Crashlytics。控制台上很少发生崩溃,尽管我们每天都在不断地重复这个错误。Android版本不会出现相同的错误。

复制步骤

  1. 打开游戏
  2. 等待加载场景即将完成或游戏场景完全加载
  3. 终止应用程序
  4. 等待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时,默认情况下,当应用程序终止时,所有请求都会中止。我们还没有调查DisposeOnDisable/OnApplicationQuit的执行顺序是否会成为问题。此外,默认情况下,BestHTTP在Application Quit期间中止的请求仍会调用回调。在我们的例子中,Save Player的回调是null,所以这可能不是问题所在。

相关崩溃:我们在装载场景中仍面临一些崩溃。据我们所见,它们发生在有请求的情况下。这些问题的再现率远低于游戏场景中的问题。

提示:我们很难在Crashlytics上检索日志,因为大多数日志都没有发送。以下是如何从iOS设备本身检索日志的步骤:

  1. 在iPhone/iPad设备上打开设置应用程序
  2. 转到隐私(在iOS 13上显示在电池下方(
  3. 滚动到底部并打开Analytics&改进
  4. 打开分析数据
  5. 查找所需应用程序的日志

最新更新