(Unity 2019.2)iOS构建的应用被用户杀死后5秒崩溃

问题描述 投票:-1回答:1

说明

应用程序在被用户终止(即强行杀死应用程序)后2~5秒呈现崩溃。这种情况只发生在多个unity版本的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设备无关。

技术信息

探索

以下是目前所有尝试过的解决方案,没有成功。

  • 删除GameAnalytics插件
  • 移除IronSource插件
  • 移除UnityIAP插件
  • 解决办法 关于PostProcess iOS
  • 设置最低操作系统版本为9.0
  • 注释所有OnApplicationPauseQuit实现(包括插件)。
  • 启用位码
ios xcode unity3d crash testflight
1个回答
0
投票

解决方法

说明: 一般的问题是,在iOS上有任何一段代码,在应用最终完成时,会阻塞主线程(见 本文件 获取更多信息)。) 在我们的例子中,它的发生是因为当玩家杀死应用程序时有持续的请求。当应用程序终止时,我们将玩家的进度保存在服务器上(使用 Dispose() 方法),该请求阻塞了主线程,导致崩溃。解决方案是删除这个特定的保存。我们测试了一个包含这个修复的构建,到目前为止,我们在游戏场景加载后,在20次尝试杀死游戏的过程中没有出现崩溃。我们之前没有想到这一点,因为这段代码从2019年8月开始就有了,而且从那时起就没有再碰过。这个问题是在2020年2月才开始发生的。

更多信息: 由于这段有问题的代码自2019年8月起就在项目中,而问题在2020年2月才开始发生,所以它是 可能的 的iOS版本与之有关。我们还没有调查变更日志,但目前呈现崩溃的最老的iOS版本是2019年10月28日发布的iOS 13.2。

另一种可能是我们的后端代码发生了一些变化,导致请求挂起。由于我们使用的是BestHTTP,默认情况下,当应用程序终止时,所有请求都会被中止。我们还没有调查是否执行顺序的 Dispose 与。OnDisable/OnApplicationQuit 可能是这个问题。另外,默认情况下,在Application Quit期间被BestHTTP中止的请求仍然会调用回调。在我们的例子中,那个保存播放器的回调是 null所以这可能不是问题所在。

相关崩溃: 我们仍然面临一些加载场景的崩溃。就我们看到的情况来看,它们发生在有请求的时候。这些问题的重现率远低于游戏场景上的问题。

提示: 我们在Crashlytics上检索日志时遇到了困难,因为大部分日志都没有被发送。以下是如何从iOS设备本身检索日志的步骤。

  1. 打开 设置 您的iPhoneiPad设备上的应用程序
  2. 前往 隐私保护 (见下文) 蓄电池 在iOS 13上)
  3. 滚动到底部,打开 分析和改进
  4. 开放式 分析数据
  5. 查找所需应用程序的日志
© www.soinside.com 2019 - 2024. All rights reserved.