iOS10+Xcode8 + iOS8 -- Xcode8的assets问题导致运行iOS8崩溃的解决方案

iOS 10 出来了,项目需要适配,更新Xode8 后,项目运行iOS 8.4 真机时,出现莫名其妙崩溃的问题。在网上寻求解决方案时发现了这篇博文-- @ian博客 Xcode8的assets问题导致运行iOS8崩溃的解决方案

看完文章后,发现操作有点复杂。点开博文文献《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编译器的升级都会伴随着大大小小的问题,只要我们怀着一颗不抛弃不放弃的决心,最后一定可以攻克难题。最后要感谢公司同事的指导,还要感谢以下参考文献的作者们,没有他们的实践,这个问题或许困扰更久。

参考文献:

1.《ITMS-90682: can’t contain 16-bit or P3 assets if the app supports iOS 8 or earlier》
2.《Xcode 8 build crash on iOS 9.2 and below》
3.《ERROR ITMS-90682: Invalid Bundle – The asset catalog at ‘Payload/XXXXX/Assets.car’ can’t contain 16-bit or P3 assets if the app supports iOS 9.3 or earlier. 》
4.《Assets.car can’t contain 16-bit or P3 assets if the app supports iOS 8 or earlier?》
5.《Community bug reports》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容