iOS10+Xcode8 + iOS8 -- Xcode8的assets問題導致運行iOS8崩潰的解決方案

iOS 10 出來了,項目需要適配,更新Xode8 后,項目運行iOS 8.4 真機時,出現(xiàn)莫名其妙崩潰的問題。在網上尋求解決方案時發(fā)現(xiàn)了這篇博文-- @ian博客 Xcode8的assets問題導致運行iOS8崩潰的解決方案

看完文章后,發(fā)現(xiàn)操作有點復雜。點開博文文獻《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.

結合項目另一個端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)了一個小按鈕,導致了這次崩潰,不知道設計師是怎么弄出來的這個特殊圖片…)如果你的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就是出現(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"
  },

四、轉換圖片為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 "------------------------------"

五、總結

出現(xiàn)這個問題真的很蛋疼,但是最后終于解決了。每一次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》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容