关于Xcode8编译ios9.3以下系统crash的问题

ios 10 出来了,项目需要适配,更新Xode8 后,项目运行iOS 8.4 真机时,出现莫名其妙崩溃的问题。上网查了许多的方法,如看的最多的解决方案(但是本方案并没有完全解决我的问题,在此基础上,我将图片从Asset里删除,并将其直接拖入项目左边栏目中,从而解决了崩溃问题,但是又发现了一个新的问题,在ios8.4里面点击进入一个有tableView的Viewcontrollers 出现了崩溃,通过查资料与实验:最终解决了这个问题,解决方案如下:- (void)dealloc {),

self.myTab.delegate = nil;

self.myTab.dataSource = nil;

)

如下:看完文章后,发现操作有点复杂。点开博文文献《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 "------------------------------"

推荐阅读更多精彩内容