iOS10+Xcode8 + iOS8 -- Xcode8的assets问题导致运行iOS8崩溃的解决方案
2016-12-07 11:15
483 查看
iOS 10 出来了,项目需要适配,更新Xode8 后,项目运行iOS 8.4 真机时,出现莫名其妙崩溃的问题。在网上寻求解决方案时发现了这篇博文– @ian博客 Xcode8的assets问题导致运行iOS8崩溃的解决方案
看完文章后,发现操作有点复杂。点开博文文献《Xcode 8 build crash on iOS 9.2 and below》
!!!发现了这个
结合项目另一个端Deployment Target 为8.0运行没问题,将发现此问题的端的Deployment Target 从8.4改为8.0 后运行就没问题了,简单快速。<( ̄3 ̄)> Xcode更新真是…涨姿势。
如果你刚刚升级了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
三、定位到问题图片
1.打一个ipa包,解压你的应用的ipa包,进入到你应用的Playload文件夹。
2.用find命令定位到Assets.car文件
3.使用 assetutil 命令导出图片的信息存储到Assets.json文件中
4.打开刚才生成的Assets.json文件,查找含有”DisplayGamut” : “P3”, “Encoding” : “ARGB-16″的内容。这个对应的Name就是出现问题的图片了。
四、转换图片为8-bit sRGB assets格式
我们找到这个图片,然后CMD+i 查看这个图片的信息,我们发现我这个出问题的文件的颜色描述文件有问题,和别的图片文件不一样。
出问题的图片:
别的图片
1.方法一(单个处理问题图片):
下面我们使用ColorSync实用工具将这个描述文件修改下
xcode8crash3
指派它的描述文件为sRGB IEC61966-2.1,保存。
xcode8crash4
再次编译运行我们的APP,发现问题解决了!
2.方法二(暴力处理所有图片):
这里我们使用bash script直接处理所有图片为正确格式,这样我们就不用去定位是哪个图片的问题了,或许更方便一些。
五、总结
出现这个问题真的很蛋疼,但是最后终于解决了。每一次Apple编译器的升级都会伴随着大大小小的问题,只要我们怀着一颗不抛弃不放弃的决心,最后一定可以攻克难题。最后要感谢公司同事的指导,还要感谢以下参考文献的作者们,没有他们的实践,这个问题或许困扰更久。
看完文章后,发现操作有点复杂。点开博文文献《Xcode 8 build crash on iOS 9.2 and below》
!!!发现了这个
Update: If your Deployment Target is set to either 8.3 or 8.4 and you have an asset catalog then you will receive this same error message, even if you do not actually have 16-bit or P3 assets. In this case you will either need to lower your Deployment Target to 8.2, or move it up to 9.x.
结合项目另一个端Deployment Target 为8.0运行没问题,将发现此问题的端的Deployment Target 从8.4改为8.0 后运行就没问题了,简单快速。<( ̄3 ̄)> Xcode更新真是…涨姿势。
博文如下:
一、前言如果你刚刚升级了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
三、定位到问题图片
1.打一个ipa包,解压你的应用的ipa包,进入到你应用的Playload文件夹。
// 在终端中打开 (补充) cd ../Playload
2.用find命令定位到Assets.car文件
find . -name 'Assets.car'
3.使用 assetutil 命令导出图片的信息存储到Assets.json文件中
sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
4.打开刚才生成的Assets.json文件,查找含有”DisplayGamut” : “P3”, “Encoding” : “ARGB-16″的内容。这个对应的Name就是出现问题的图片了。
// 打开json文件 (补充) open /tmp/Assets.json
{ "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格式
我们找到这个图片,然后CMD+i 查看这个图片的信息,我们发现我这个出问题的文件的颜色描述文件有问题,和别的图片文件不一样。
出问题的图片:
别的图片
1.方法一(单个处理问题图片):
下面我们使用ColorSync实用工具将这个描述文件修改下
xcode8crash3
指派它的描述文件为sRGB IEC61966-2.1,保存。
xcode8crash4
再次编译运行我们的APP,发现问题解决了!
2.方法二(暴力处理所有图片):
这里我们使用bash script直接处理所有图片为正确格式,这样我们就不用去定位是哪个图片的问题了,或许更方便一些。
#!/bin/bash DIRECTORY=$1 echo "------------------------------" echo "Passed Resources with xcassets folder argument is <$DIRECTORY>" echo "------------------------------" echo "Processing asset:" XSAASSETSD="$(find "$DIRECTORY" -name '*.xcassets')" for xcasset in $XSAASSETSD do echo "---$xcasset" IMAGESETS="$(find "$xcasset" -name '*.imageset')" for imageset in $IMAGESETS do echo "------$imageset" FILES="$(find "$imageset" -name '*.png')" for file in $FILES do echo "---------$file" sips -m "/System/Library/Colorsync/Profiles/sRGB Profile.icc" $file --out $file done done done echo "------------------------------" echo "script successfully finished" echo "------------------------------"
五、总结
出现这个问题真的很蛋疼,但是最后终于解决了。每一次Apple编译器的升级都会伴随着大大小小的问题,只要我们怀着一颗不抛弃不放弃的决心,最后一定可以攻克难题。最后要感谢公司同事的指导,还要感谢以下参考文献的作者们,没有他们的实践,这个问题或许困扰更久。
相关文章推荐
- Xcode8的assets问题导致运行iOS8崩溃的解决方案
- Xcode8的assets问题导致运行iOS8崩溃的解决方案
- iOS - Xcode8的(图片格式)assets问题导致运行iOS8崩溃
- 【Android开发经验】关于主题引用混乱导致程序运行崩溃的问题
- FindContours()函数使用时导致的程序崩溃问题的解决方案
- Android studio新建项目之后由于gradle配置问题导致项目无法运行的个人解决方案分享
- LocationManager调用requestLocationUpdates 某些手机上打包APK无法运行,导致崩溃的问题
- Android 6.0 运行中手动去设置界面取消该app的某个权限,导致application被强制销毁造成app崩溃问题的解决
- linux上面运行python抓取数据时由于chromedriver和chromium没有关闭导致的内存泄漏的问题解决方案
- Flask SqlAlchemy Enum 导致运行KeyError问题的解决方案
- MFC中使用FindContours()函数使用时导致的程序崩溃问题的解决方案
- MFC项目使用webbrowser控件,点击载入的页面里的文件下载链接后导致程序的崩溃问题的解决方案
- 更新xcode8、ios10之后,隐私权限设置问题,运行崩溃报错
- 让人抓狂的问题:运行WPF Browser Application(XBAP)导致PresentationHost(IE)崩溃
- 【Android开发经验】关于主题引用混乱导致程序运行崩溃的问题
- xcode8由于权限问题导致崩溃
- 【iOS开发】静态库导致的运行时崩溃问题
- Xcode8编译包在iOS8中运行异常闪退问题
- 安卓奇葩问题之:运行OK,打包安装崩溃(原因是:代码不规范导致编译出错)
- Node出错导致运行崩溃的解决方案