Xcode8---ios9.2一下崩潰問題

zej1994830發表於2017-05-08

一、前言

如果你剛剛升級了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檔案 
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就是出現問題的圖片了。

{
    "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"
  },
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

四、轉換圖片為8-bit sRGB assets格式

這裡我們使用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 "------------------------------"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

參考文獻: 
StackOverFlow 
連線 
中文技術支援

相關文章