iOS 巨坑,快去看看你的.ipa的包中是不是包含16-bit或者P3格式的图片,iOS9.3以下版本的手机线上会闪退

场景是这样的,同事说他遇到一个大坑,如果你的.ipa的包中包含有16-bit或者P3格式的图片,会有一个很蛋疼的问题。使用Xcode8打包上线,iOS9.3以下版本的手机,运行一会就随机在任何页面崩溃了。

这个时候
你用Xcode直接刷机器<iOS9.3以下版本>测试,木有问题,
模拟器<iOS9.3以下版本>运行木有问题,
打包传到蒲公英或者其他途径,安装到真机上<iOS9.3以下版本>,木有问题。

但是,但是,就是上线之后有问题了。
看到这,我就懵逼了。

不过幸好,使用testFlight安装在iOS9.3以下版本还是能够复现的。

1、将.ipa的后缀名修改成为.zip

image.png

2、显示包内容找到 Assets.car

image.png

3、终端命令进行解析

sudo xcrun —sdk iphoneos assetutil —info /Users/morris/********/Payload/Demo.app/Assets.car > /tmp/Assets.json

后面的文件路径可以写其他的。

4、找到生成的 <code>/tmp/Assets.json</code>

image.png
image.png

全局搜索关键字 <code> P3</code>,和关键字 <code>BitsPerSample" : 16</code>
如果找到的话,根据关键字的name在项目中找到该图片。

image.png

根据相关的比较,图片的格式是这样的:

image.png

两张图片都是png格式的图片。
注意那个颜色空间,UI平常给我们切的图一般的颜色控件是RGB的。

实际图片进行对比:
灰度图:


image.png

灰度图转化成RGB图:


image.png

转化成RGB之后的图片:


image.png

具体的原因:
在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

如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。

相关的参考资料:
http://blog.csdn.net/wangletiancsdn/article/details/72901488
https://stackoverflow.com/questions/39404285/xcode-8-build-crash-on-ios-9-2-and-below

推荐阅读更多精彩内容