iOS - Xcode8的(图片格式)assets问题导致运行iOS8崩溃

前言:

最近升级 Xcode8.0后一直担心有什么隐藏的问题,今天又被坑了一次,不知道什么原因 Xcode 运行的时候一直crash到main函数,卡在启动页,没有任何错误信息,仔细检查了自己写的东西,确认没有什么错误,在项目里面是一顿狂找,还是无果,折腾了很久,就利用 SVN 回滚,才发现是最近添加图片的造成的原因,下面给出解决方法:

6DA1D65CB694340246488599D474C77E.jpg

左图是不符合要求的图片格式,右图是符合要求的图片

针对情况:

如果你刚刚升级了Xcode8,而你的项目的Deployment Target是iOS 9.3以下,运行iOS8的时候过了几十秒后crash到main函数,出现EXC_BAD_ACCESS,或者崩溃到imageNamed:,或者每次编译运行随机崩溃到某个地方。

崩溃的原因:

在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

定位到问题图片
  • 打一个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"
 },
具体的图片处理方式:
  • 最简单的方法就是,联系 UI 重新锁一个符合要去的图片(这是最简答的方法)
  • 当然还有其他的解决方法(操作有点复杂),请参考https://www.ianisme.com/ios/2409.html
当然还可以参考这篇文章:

http://stackoverflow.com/questions/39404285/xcode-8-build-crash-on-ios-9-2-and-below

推荐阅读更多精彩内容