iOS 10 出來了,項目需要適配章贞,更新Xode8 后寝蹈,項目運行iOS 8.4 真機時节槐,出現(xiàn)莫名其妙崩潰的問題晶框。在網(wǎng)上尋求解決方案時發(fā)現(xiàn)了這篇博文-- @ian博客 Xcode8的assets問題導(dǎo)致運行iOS8崩潰的解決方案
看完文章后析桥,發(fā)現(xiàn)操作有點復(fù)雜。點開博文文獻《Xcode 8 build crash on iOS 9.2 and below》
!!!發(fā)現(xiàn)了這個
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.
結(jié)合項目另一個端Deployment Target 為8.0運行沒問題里覆,將發(fā)現(xiàn)此問題的端的Deployment Target 從8.4改為8.0 后運行就沒問題了丧荐,簡單快速。<( ̄3 ̄)> Xcode更新真是...漲姿勢喧枷。
博文如下:
一虹统、前言
如果你剛剛升級了Xcode8,而你的項目的Deployment Target是iOS 9.3以下隧甚,運行iOS8的時候過了幾十秒后crash到main函數(shù)车荔,出現(xiàn)EXC_BAD_ACCESS,或者崩潰到imageNamed:戚扳,或者每次編譯運行隨機崩潰到某個地方忧便。那么恭喜你,你讀完這個文章你可能就解決了帽借。
二珠增、崩潰原因
在Xcode8中,如果你的圖片資源文件里有16位圖或者圖片顯示模式為P3砍艾,并且Deployment Target是iOS9.3以下的就會出現(xiàn)這個問題蒂教。(話說我公司的項目里面就出現(xiàn)了一個小按鈕,導(dǎo)致了這次崩潰脆荷,不知道設(shè)計師是怎么弄出來的這個特殊圖片…)如果你的App需要支持wide color functionality凝垛,那你就必須設(shè)置Deployment Target為iOS9.3以上懊悯。如果你的APP不需要支持wide color functionality并且你希望兼容iOS老版本,那么你需要將所有16-bit or P3 assets的圖片轉(zhuǎn)換為8-bit sRGB assets
三梦皮、定位到問題圖片
1.打一個ipa包炭分,解壓你的應(yīng)用的ipa包,進入到你應(yīng)用的Playload文件夾剑肯。
// 在終端中打開 (補充)
cd ../Playload
2.用find命令定位到Assets.car文件
find . -name 'Assets.car'
3.使用 assetutil 命令導(dǎo)出圖片的信息存儲到Assets.json文件中
sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json
4.打開剛才生成的Assets.json文件捧毛,查找含有”DisplayGamut” : “P3”, “Encoding” : “ARGB-16″的內(nèi)容。這個對應(yīng)的Name就是出現(xiàn)問題的圖片了让网。
// 打開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"
},
四岖妄、轉(zhuǎn)換圖片為8-bit sRGB assets格式
我們找到這個圖片,然后CMD+i 查看這個圖片的信息寂祥,我們發(fā)現(xiàn)我這個出問題的文件的顏色描述文件有問題,和別的圖片文件不一樣七兜。
出問題的圖片:
別的圖片
1.方法一(單個處理問題圖片):
下面我們使用ColorSync實用工具將這個描述文件修改下
xcode8crash3
指派它的描述文件為sRGB IEC61966-2.1丸凭,保存。
xcode8crash4
再次編譯運行我們的APP腕铸,發(fā)現(xiàn)問題解決了惜犀!
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 "------------------------------"
五、總結(jié)
出現(xiàn)這個問題真的很蛋疼涛菠,但是最后終于解決了莉御。每一次Apple編譯器的升級都會伴隨著大大小小的問題,只要我們懷著一顆不拋棄不放棄的決心俗冻,最后一定可以攻克難題礁叔。最后要感謝公司同事的指導(dǎo),還要感謝以下參考文獻的作者們迄薄,沒有他們的實踐琅关,這個問題或許困擾更久。
參考文獻:
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》