Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录

好吧简单记录下这次吐血的崩溃事故,十一过后本以为可以开开心心地开发新需求了. 正当我打开Xcode开始大战一回合时. 叮铃! 技术总监的一条微信叫停了我, 视频里头用户点击一App启动就崩,一点就崩,一点就崩.没错就是这么暴力…我心想完蛋了,八成是该领盒饭了…

Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录_第1张图片
友盟崩溃记录

颤抖的双手立马打开友盟后台,卧槽…前所未有的壮观啊,奔溃列表整齐划一,出奇地一致! Application received signal SIGSEGV 看得我一眼懵逼. 其实这样的崩溃提示在此之前也有遇到过, 通过dSYM分析基本没戏,因为最后一条崩溃记录的有效地址指向的始终是友盟搜集崩溃信息的方法.

Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录_第2张图片
崩溃率.png

再瞅了一眼崩溃率, 一路飙升,久违的心情… 从万分之2到万分之18,一下子拉高了我们的崩溃率,虽然几百万用户中暂时只影响到了不到150位用户,但是我们还是担心时态会不断扩大. 问题几乎已经到了非解决不可的地步了.

问题初见

随后,简单分析了下该类用户的属性发现,几乎所有的崩溃只发生在iOS9.0-9.2系统的用户,于是我们着手进行问题排查.

首先想到的肯定就是模拟器运行进行断点调试,直接定位崩溃位置. 好吧很显然事情并没有那么简单,模拟器完美运行没有任何幺蛾子. 只能借助真机进行测试,结果我们的测试机很巧妙地避开了9.3以下的系统,最低系统只有9.3.2,GG! 然后开始在群里在朋友圈找机子,很显然…这样一个古董级的系统的机子基本是大海捞针. 好在客服人员要到了之前出现崩溃的用户的电话(是一个很有耐心的妹子,23333…),简单交流后我们建立了沟通渠道,接下来就是一段漫长的折腾之旅.

解决过程

猜想1: 由于升级了第三方SDK引起

从用户反馈的崩溃视频里来看,是用户一启动App就崩溃,所以我们猜想是不是在didFinishLaunchingWithOptions方法里出现了问题. 然后在对比了代码后发现,在这个版本的开发计划中并没有对该处代码进行过改动.相反,最大的改动就是升级了两个第三方的SDK,猜测可能是在启动的时候进行SDK相关配置不当引起的. 所以我们尝试恢复SDK版本进行打包测试, 逐一恢复SDK后, 我们将两个测试包胆战心惊地发给了我们的测试用户. 不一会,用户给我们反馈说: 不行!崩了… 不行,还是崩了…

两个测试包壮烈牺牲,同时也冤枉SDK了,默哀!

猜想2: 升级Xcode10后,之前项目中引用过一个c++的静态依赖库 libstdc++.6.0.9.tbd 被移除导致的

正在我愁眉苦展的时候,突然想到这次我们升级了Xcode10,之前项目中引用过一个c++的静态依赖库,后来编译的时候未通过,提示该库不存在, frameworks目录下这个库报红了,一个潇洒的delete之后再次编译通过了… 后来也没再多想. 所以我想在会不会是因为我这个潇洒的delete导致的. 接下来,我尝试用网友提供的方案进行解决.

由于libstdc++.6.0.9.tbd 这个库早已被苹果废弃了,这次Xcode10苹果将其彻底移除了,并推荐使用libc++这个库. 按照网友的提示,我回到Xcode9上找到libstdc++.6.0.9.tbd这个库将其拷贝到Xcode10中重新添加(注意:重新添加需要先退出Xcode再打开才能链接) 好了,添加完成,确保无误,打包…

结果,你知道的. 还是崩了… 这个时候我们都好绝望… 难道说跟库没有关系? 我开始怀疑人生了…

所以后来猜想是不是上述提供的这种方案不可行呢? 难道说不能通过直接拷贝的方式连接库吗? 所以我回到了Xcode9上重新打包,再次将链接发给测试用户帮忙安装后回复说: 可以的,这次没有崩溃… 沃德天,终于有一次OK的, 胜利似乎就在前方. 实在感谢妹子的帮忙,一个小小的红包敬上…耽误时间十分抱歉.

猜想3: 可能与Xcode10打包有关系

这个时候我大胆地做了个测试,决定用Xcode9Xcode10分别打包添加库和未添加库,全面排查下到底是由于Xcode升级导致的崩溃还是由于libstdc++.6.0.9.tbd引起的.

Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录_第3张图片
ipa文件

冒着大不韦的心态,我又去找测试小姐姐去了,等待的过程总是煎熬的…不过妹子人很好很有耐心, 一个“行吧”把我高兴坏了. 一遍遍帮我测试了3.11.2-3.11.5四个测试包.

结果发现3.11.2和3.11.3都没有出现崩溃,3.11.4和3.11.5都出现了崩溃,测试结果显而易见: 使用Xcode9打包的应用都没有问题,相反使用Xcode10打包的应用都GG了, 同时也排除了崩溃跟libstdc++.6.0.9.tbd库有关系.

果然,这又是苹果埋下的坑,真是无语… 接下来当然是去找度娘和Google爸爸了: “使用Xcode10打包导致iOS9.0用户崩溃”,结果也能找到一些类似的情况. 首先看到的是之前升级Xcode9的时候打包也会出现类似的情况.

而且,从两个Xcode打包的ipa文件大小我也发现,Xcode10打包的文件明显比Xcode9多了大概2M的样子,猜测肯定跟图片资源打包有关系.


Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录_第4张图片
ipa文件.png

接下来我开始尝试着用下面的方案去排查是否含有16bit图或者P3格式的图片资源. P3图片导致iOS9.3以下崩溃问题 排查结果发现,我们项目中并未使用不合规格的图片,排除.

后来我在CocoaChina上看到了一毛一样的崩溃提问. 好了,基本可以锁定就是由于苹果升级Xcode导致 使用Xcode打包图片资源时不兼容iOS9.0-9.2真机导致的.
用xcode10打包上线,iOS9.2系统出现闪退bug
Xcode10发布App Store,iOS9崩溃

解决方案

一番查阅之后,大家给出的方案无外乎以下方式:

  • 老老实实用Xcode9打包发布吧;

  • 将Assets目录下的图片资源转为文件夹存储; (几百张图片,这操作简直逆天…)

  • 等待苹果的修复更新…

终于我们找到了苹果Xcode 10.1 beta 2 的更新日志, 在 Asset Catalog 下面我们看到下面这样一段说明: Xcode10 beta2 更新记录地址

Resolved Issues

  • The 40mm and 44mm wells for complications specify the correct icon sizes. (43069075, 43401397)
  • Resolves an issue that affected app compatibility with iOS 9.0, 9.1 and 9.2. Apps containing asset catalogs built with Xcode 10 whose deployment target was set to iOS 9.0, 9.1 or 9.2 would produce content incompatible with the runtimes of those iOS versions. Rebuilding the application with Xcode 10.1 resolves this issue. (44535967)

从更新说明来看,果然应验了之前的猜想,崩溃与Xcode10打包图片文件有关系.

解决方案显而易见, 更新Xcode10.1 beta2 重新打包就可以正常下载安装使用了, 赶紧下载安装Xcode10.1 beta2,给小姐姐打包测试, 等待了大约半个小时后小姐姐回复说: 没有闪退.

完美~ 问题终于解决了. 又一次被苹果儿子实力坑爹的崩溃,过程一波三折,好在测试小姐姐人好耐心好,帮我们完成了十几轮的测试工作,实在感谢. 正是有了这样有耐心的优质用户,我们的App才能更加完美.实在感谢~

附: Xcode10.1 beta2 下载地址:https://developer.apple.com/download/

你以为这就结束了吗?

Xcode10.1 beta2 打包的应用,上传至AppStore审核后被拒....提示: 二进制文件无效... 所有暂时还是用Xcode9打包吧,等Xcode10稳定以后再使用它打包.

实力坑爹后续

好吧,更新下...Xcode10.1正式版前段时间更新了,当然我们第一时间做了更新, 不过Xcode10.1 依旧没有解决这个崩溃问题,评论里也好多简友反映. 果真是实力坑爹...也许这就是苹果强制用户升级或放弃iOS9的一种策略吧

目前的话: 我们是直接升级development targetiOS10.0, 后续的版本更新不再对iOS10以下的用户发布, 毕竟这部分手机系统的用户占比并不是很大.
实现不想抛弃的话,那就继续沿用Xcode9.4打包发布吧,笔芯.

你可能感兴趣的:(Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录)