在實際開發過程中,經常會遇到使用一個xcode工程來管理多個渠道定制版的情況,這些定制版往往代碼都大部分相同,差別可能在于每個頁面上面的UI、切圖不一樣~,如果我們把每個定制版不同的切圖全部放進工程里面,這樣打包出來的安裝文件ipa就會增加額外的大小,所以這篇文章就是介紹在編譯時怎樣利用一個簡單的腳本把多余的定制版資源去掉。
新建一個工程,在TARGETS——Build Phases下我們看到?下方的是xcode在構建階段的順序,無論是平時在Build、Run、或是Archive的時候都會按順序執行下面的幾項。最后一項是Copy Bundle Resources,會將項目中的.bundle、.xib? 、.storyboard文件、圖片asset文件等一起復制進去,所以我們新建一個New Run Script Phase, 并將它放置在Copy Bundle Resources之上。
腳本的思路是:
1、從xcassets中刪除上一個定制版的資源圖片
2、把本次需要運行的定制版的圖片復制到xcassets中去,由于平時在xcassets中每添加一張圖片,xcode都會在資源目錄下自動創建一個content.json文件(如圖所示),里面包含了對應的圖片名稱以及比例信息,所以使用腳本添加圖片時候還需創建相應的json文件。
由于在腳本中創建并為每個文件創建一個content.json文件太麻煩,所以事先我們在工程目錄下復制一個content.json文件,并把json里面的描述改為“filename”為“123”、“scale”為“2x”。
在腳本中只要進行把這個json文件在每張圖片目錄下復制一份,并把json中的文件名改為對應的圖片名即可。
下面是完整的腳本代碼:
echo -e "\n==== Start Copy Channel Resource ===\n"
##
## Copy Channel Resource Script
##
#---------------- Channel Config 路徑 ----------------------------------------------------------------
ChannelConfigFolderPath="${SRCROOT}/ChannelConfig" #定制版文件夾路徑
ChannelName="123" #渠道名稱
ChannelResourceFullPath="${ChannelConfigFolderPath}/${ChannelName}" #對應的資源路徑
TargetAssetsFullPath="${SRCROOT}/ScriptDemo/Assets.xcassets/" #工程中xcassets的位置
ReSourceDirName="ChannelResource" #存放定制版圖片的文件夾名字
echo "-ShellWork- Channel Path: ${ChannelConfigFolderPath} -"
#---------------- Remove Others Channel Resource 刪除多余定制版資源 ---------------------------------
AppChannelResource="${ChannelResourceFullPath}/ChannelResource"
ImageJson="${ChannelResourceFullPath}/ChannelResource/Contents.json"
echo "________${AppChannelResource}"
for fileDir in "${TargetAssetsFullPath}"/*; do
if [[ ${fileDir} =~ ${ReSourceDirName} ]]
then
echo "刪除現有資源:${fileDir}"
rm -r ${fileDir}
fi
done
#將定制版的資源圖片轉化為xcode能夠識別的格式
for somePng in "${AppChannelResource}"/*; do
if [[ "${somePng##*.}" == "json" ]]
then
echo ${somePng}
elif [[ "${somePng##*.}" == "png" ]]
then
imageFile=$(basename ${somePng})
echo "_______${imageFile}"
imageDir=${imageFile/\.png/\.imageset}
echo "_______${imageDir}"
cd ${AppChannelResource}
mkdir ${imageDir}
#將圖片拷貝入“文件名.imageset”文件夾,并進入該文件夾
mv -f ${imageFile} ${imageDir}
cp -f ${ImageJson} ${imageDir}
cat ${imageDir}/Contents.json
sed 's/123.png/'${imageFile}'/g' ${imageDir}/Contents.json > ${imageDir}/Contents.json.tmp
mv ${imageDir}/Contents.json.tmp ${imageDir}/Contents.json
fi
done
#復制定制版資源文件到工程Assets
cp -r ${AppChannelResource} "${TargetAssetsFullPath}/${ReSourceDirName}"
把腳本拉進去工程剛才新建的Build Phases之中,注意開放腳本文件的權限
點擊Run,可以在xcassets中看到三張圖片已經被替換,并且在finder中生成了對應的content.json文件。
最后是更換圖片前后運行的效果
另外appicon與啟動頁也可以采用同樣的方法來進行更換。