Xcode10 archive的包,iOS9.0,iOS9.1,iOS9.2系统启动APP就闪退(附Xcode9.4下载地址)

解决方法

使用Xcode 9重新打包,安装包下载地址。xip格式Xcode 9.4 安装包下载地址

问题描述

Xcode10 更新后,使用它发布新版。但是线上崩溃率剧增,且集中在iOS9.0、iOS9.1、iOS9.2这三个系统上。奔溃堆栈看,多数崩溃与UIImage相关,但是除了奔溃集中在这三个系统以外,并无规律可循。

艰辛历程

1、根据奔溃堆栈,搜索相关解决方案,恭喜你入坑了。
大部分崩溃中都包含了下面的调用
[CUIStructuredThemeStore renditionWithKey:usingKeySignature:]
所以初期导向了类似以下的解决方法:这里列举简书上的(https://www.jianshu.com/p/7f736a86a065),其他方法类似。
但是实际测试发现,和图片格式没有关系,修改之后问题依然存在。
这里补充一下,这个问题Debug模式未必能出现,但是release却可以稳定复现,有内测环境的可以比较方便出包验证,没有条件的建议可以使用TestFlight做beta测试(再补充一下,发现TestFlight在iOS9.2上奔溃率也非常高,所以这个问题验证起来很痛苦)。

2、开始排查变量,怀疑编译器的问题。
一番紧张折腾之后,问题没有解决,冷静下来分析,最大的变量和隐患就是编译器的问题,毕竟刚升级的Xcode 10,且搜索发现Xcode8.0发布时就发生过类似问题,难道苹果又犯了同样的错误?抱着试一试的态度,寻找Xcode10相关的Bug帖子,结果在stackoverflow中还找到了答案。果然还是Xcode 10 的坑。

3、读完帖子大体有两种方法解决:

  • 提高DeploymentTarget到iOS9.3或更高
  • 重新使用Xcode 9重新打包(如果调用了iOS12才有的API,使用Xcode9只能用iOS11的SDK编译,调用最新API的地方只能通过 NSInvocation 来解决。NSInvocation只了解过,没啥实际使用经验,附上两个入门介绍:介绍1介绍2

对比之后,如果没有调用iOS12的新增API,可以直接使用Xcode9重新编译上传。由于多数开发者升级Xcode10之后,没有保留旧版,苹果官网也没有找到旧版的下载地址,这里附上xip格式Xcode 9.4 安装包下载地址

Apple也意识到了这个bug,并发布了Xcode 10.1 beta 2修复了这个bug,但是这个beta版本无法上传AppStore,所以在Xcode 10.1正式版没有发布之前,最好还是使用Xcode 9重新打包修复这个问题。

请注意

Xcode 10.1 Release版依然没有修复这个问题!在其release Note 的Known Issues 中醒目得写着

  • Apps that contain asset catalogs built using Xcode 10 or later with a deployment target set to iOS 9.0, 9.1 or 9.2 produce content incompatible with the runtimes of those iOS versions. (44535967, 45723580, 45723189)

想当然的以为这个Release会修复这个问题,但是从线上崩溃率看,应该是部分修复了,崩溃率已经减少了,但依然存在(这里不排除前期问题的影响,对iOS9.0-9.2的用户进行了一轮血洗,造成这个系统的用户数量较少,进而崩溃率降低)。提醒各位,线上发版还是要谨慎,编译器的严重bug,必须确认真切后再更新使用,避免二次入坑。

推荐阅读更多精彩内容