最近更新了Xcode10和macOS10.14,想着可以在暗黑模式下尽情潇洒。然而,在用Xcode10打包提交一个版本之后,线上崩溃接踵而至。这就很尴尬了,发布前,不管是开发自测还是测试同学的调试,都没有问题,一上线就各种问题。
查看了bugtags上的反馈情况,发现崩溃基本集中在iOS9系统上,Google了一波,大神们说,是Xcode10的毛病。具体情况是这样的:
bug复现条件:
1、APP最低版本支持iOS9.0-iOS9.2.1之间的系统;
2、Xcode10打包;
3、使用xcassets管理图片;
4、xcassets中有非jpg的图片;
注:该问题,打蒲公英的测试包无法复现,直接在手机上运行无法复现,模拟器上无法复现(本人亲测)。
解决方案:
方案一:如果没有使用iOS12 的新功能,建议暂时用Xcode9打包,等待Xcode10.1版本修复该问题;
方案二:把xcassets图片放到bundle里;
方案三:最低版本支持设置为iOS9.3及以上;
方案四:把xcassets图片全部替换成jpg,必须全部替换,不然已然存在crash风险;
方案五:把Xcode9打包生成的Assets.car替换Xcode10打包生成的Assets.car。
具体crash原因:Xcode10打包生成的Assets.car,非jpg图片会多一套palette-img压缩算法的图片(Xcode9是lzfse压缩算法),这也解释了Xcode10打包生成的Assets.car会大一些的原因,jpg图片用Xcode10打包和用Xcode9打包都只有lzfse,所以直接替换Assets.car是兼容的。
至此,Xcode10打包在iOS9上引发crash的问题得到解决。如果有说的不对,或者理解不到位的地方,还请各位大佬批评指正,谢谢您的耐心阅读。
好吧简单记录下这次吐血的崩溃事故,十一过后本以为可以开开心心地开发新需求了. 正当我打开Xcode开始大战一回合时. 叮铃! 技术总监的一条微信叫停了我, 视频里头用户点击一App启动就崩,一点就崩,一点就崩.没错就是这么暴力…我心想完蛋了,八成是该领盒饭了…
颤抖的双手立马打开友盟后台,卧槽…前所未有的壮观啊,奔溃列表整齐划一,出奇地一致! Application received signal SIGSEGV
看得我一眼懵逼. 其实这样的崩溃提示在此之前也有遇到过, 通过dSYM
分析基本没戏,因为最后一条崩溃记录的有效地址指向的始终是友盟搜集崩溃信息的方法.
再瞅了一眼崩溃率, 一路飙升,久违的心情… 从万分之2到万分之18,一下子拉高了我们的崩溃率,虽然几百万用户中暂时只影响到了不到150位用户,但是我们还是担心时态会不断扩大. 问题几乎已经到了非解决不可的地步了.
问题初见
随后,简单分析了下该类用户的属性发现,几乎所有的崩溃只发生在iOS9.0-9.2系统的用户,于是我们着手进行问题排查.
首先想到的肯定就是模拟器运行进行断点调试,直接定位崩溃位置. 好吧很显然事情并没有那么简单,模拟器完美运行没有任何幺蛾子. 只能借助真机进行测试,结果我们的测试机很巧妙地避开了9.3以下的系统,最低系统只有9.3.2,GG! 然后开始在群里在朋友圈找机子,很显然…这样一个古董级的系统的机子基本是大海捞针. 好在客服人员要到了之前出现崩溃的用户的电话(是一个很有耐心的妹子,23333…),简单交流后我们建立了沟通渠道,接下来就是一段漫长的折腾之旅.
解决过程
从用户反馈的崩溃视频里来看,是用户一启动App就崩溃,所以我们猜想是不是在didFinishLaunchingWithOptions
方法里出现了问题. 然后在对比了代码后发现,在这个版本的开发计划中并没有对该处代码进行过改动.相反,最大的改动就是升级了两个第三方的SDK,猜测可能是在启动的时候进行SDK相关配置不当引起的. 所以我们尝试恢复SDK版本进行打包测试, 逐一恢复SDK后, 我们将两个测试包胆战心惊地发给了我们的测试用户. 不一会,用户给我们反馈说: 不行!崩了…
不行,还是崩了…
两个测试包壮烈牺牲,同时也冤枉SDK了,默哀!
正在我愁眉苦展的时候,突然想到这次我们升级了Xcode10
,之前项目中引用过一个c++
的静态依赖库,后来编译的时候未通过,提示该库不存在, frameworks
目录下这个库报红了,一个潇洒的delete
之后再次编译通过了… 后来也没再多想. 所以我想在会不会是因为我这个潇洒的delete
导致的. 接下来,我尝试用网友提供的方案进行解决.
由于libstdc++.6.0.9.tbd
这个库早已被苹果废弃了,这次Xcode10
苹果将其彻底移除了,并推荐使用libc++
这个库. 按照网友的提示,我回到Xcode9
上找到libstdc++.6.0.9.tbd
这个库将其拷贝到Xcode10
中重新添加(注意:重新添加需要先退出Xcode再打开才能链接) 好了,添加完成,确保无误,打包…
结果,你知道的. 还是崩了… 这个时候我们都好绝望… 难道说跟库没有关系? 我开始怀疑人生了…
所以后来猜想是不是上述提供的这种方案不可行呢? 难道说不能通过直接拷贝的方式连接库吗? 所以我回到了Xcode9上重新打包,再次将链接发给测试用户帮忙安装后回复说: 可以的,这次没有崩溃…
沃德天,终于有一次OK的, 胜利似乎就在前方. 实在感谢妹子的帮忙,一个小小的红包敬上…耽误时间十分抱歉.
这个时候我大胆地做了个测试,决定用Xcode9
和Xcode10
分别打包添加库和未添加库,全面排查下到底是由于Xcode升级导致的崩溃还是由于libstdc++.6.0.9.tbd
引起的.
冒着大不韦的心态,我又去找测试小姐姐去了,等待的过程总是煎熬的…不过妹子人很好很有耐心, 一个“行吧”把我高兴坏了. 一遍遍帮我测试了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的样子,猜测肯定跟图片资源打包有关系.
接下来我开始尝试着用下面的方案去排查是否含有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 target
到 iOS10.0
, 后续的版本更新不再对iOS10以下的用户发布, 毕竟这部分手机系统的用户占比并不是很大.
实现不想抛弃的话,那就继续沿用Xcode9.4打包发布吧,笔芯.
---------------------
作者:buyu03
来源:CSDN
原文:https://blog.csdn.net/buyu03/article/details/83068638
版权声明:本文为博主原创文章,转载请附上博文链接!
作者:爨乡的云
链接:https://www.jianshu.com/p/de3966c76cc8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。