一、前言
文章主要讲解自己亲身经历的一个奇葩问题的处理全过程:
Xcode8打包发布后iOS9.0~9.2机型闪退
就在几个月前,在公司发布更新app后,很快通过了苹果的审核,本来很高兴,这下该解决的bug也解决了,新功能也上线了,可以涨工资了,哇哈哈!!!
突然,微信里面收到腾讯Bugly发过来的消息提醒(项目集成了Bugly,主要是监测崩溃率,上报崩溃日志),说我的应用崩溃率波动异常大,此时的我心中有一万个草泥马在奔跑,赶紧打开Bugly看崩溃日志,经过一番排查定位,最终确定新版本的崩溃全部发生在了iOS 9.0 ~ 9.2之间,哥们我赶紧拿出所有测试机(也只有iOS 7.1/9.3.5/10.1三部手机),用代码跑没问题,从App Store下载更新也没问题。找遍全公司,幸好有个小妹妹的古老的iPad 系统是9.1,二话不说夺了过来,赶紧用代码运行跑起来,哎哟握草,不会崩溃啊,一脸懵逼!!!换个思路,直接从App Store下载下来,好了,见证奇迹的时刻来了,哎哟,我一启动app,卡着不动,大约10s之后果断闪退,此时的我泪流满面啊,果然崩溃发生在iOS 9.0 ~ 9.2。
你以为问题就解决了么?这只是定位到了问题,问题出在哪然而还是一脸懵逼,为什么会这样,然后开始疯狂搜索。。。
二、崩溃原因
在Xcode8中,如果你的图片资源文件里有16位图或者图片显示模式为P3,并且Deployment Target是iOS9.3以下的就会出现这个问题。(话说项目里面就是因为一张小小的图片,导致了这次崩溃,不知道设计师是怎么弄出来的这个特殊图片…)如果你的App需要支持wide color functionality,那你就必须设置Deployment Target为iOS9.3以上。如果你的APP不需要支持wide color functionality并且你希望兼容iOS老版本,那么你需要将所有16-bit or P3 assets的图片转换为8-bit sRGB assets。
此前图片资源都是放在另外的文件夹里面的,而这个版本特意整理了项目的文件夹,把图片资源都放到了image.xcassets了,这一移动导致这个问题的出现。
三、定位问题图片
- 打一个ipa包,解压你的应用的ipa包,进入到你应用的Playload文件夹。
- 用find命令定位到Assets.car文件
find . -name 'Assets.car'
- 使用 assetutil 命令导出图片的信息存储到Assets.json文件中
sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
- 打开刚才生成的Assets.json文件,查找含有”DisplayGamut” : “P3”, “Encoding” : “ARGB-16″的内容。这个对应的Name就是出现问题的图片了。
{
"SizeClass Vertical" : "universal",
"Graphics" : "GLES2,0",
"Name" : "ianisme.com",
"Scale" : 2,
"Idiom" : "universal",
"Memory" : "512MB",
"LayoutDirection" : "0 - Horizontal",
"DisplayGamut" : "P3",
"Encoding" : "ARGB-16",
"SizeClass Horizontal" : "universal",
"Image Type" : "kCoreThemeOnePartScale",
"AssetType" : "Image",
"Subtype" : 0,
"EdgeInsets" : "top:0 left:0 bottom:0 right:0"
}
四、转换图片为8-bit sRGB assets格式
找到这个图片,然后Command+i 查看这个图片的信息,发现这个出问题的文件的颜色描述文件有问题,和别的图片文件不一样。
使用ColorSync实用工具将这个描述文件修改如下:
指派它的描述文件为sRGB IEC61966-2.1,保存。
最后打包重新加急审核。。。第二天,审核通过,下载安装没有问题。
五、总结
这次的问题若不是及时发现,将会会导致大面积用户无法正常使用app,从而升级成一次严重事故。幸运的是问题及时解决了,很感谢小妹妹的救命iPad。所以,遇到问题不必惊慌,只要按照正常思路,发现问题,寻找规律、定位问题、直到找到解决办法。
此外还要感谢以下技术大牛:
顺便附上一片app性能检测的文章: