在實(shí)際開發(fā)過(guò)程中赊颠,經(jīng)常會(huì)遇到使用一個(gè)xcode工程來(lái)管理多個(gè)渠道定制版的情況圾结,這些定制版往往代碼都大部分相同瑰剃,差別可能在于每個(gè)頁(yè)面上面的UI、切圖不一樣~筝野,如果我們把每個(gè)定制版不同的切圖全部放進(jìn)工程里面,這樣打包出來(lái)的安裝文件ipa就會(huì)增加額外的大小粤剧,所以這篇文章就是介紹在編譯時(shí)怎樣利用一個(gè)簡(jiǎn)單的腳本把多余的定制版資源去掉歇竟。
新建一個(gè)工程,在TARGETS——Build Phases下我們看到?下方的是xcode在構(gòu)建階段的順序抵恋,無(wú)論是平時(shí)在Build焕议、Run、或是Archive的時(shí)候都會(huì)按順序執(zhí)行下面的幾項(xiàng)弧关。最后一項(xiàng)是Copy Bundle Resources盅安,會(huì)將項(xiàng)目中的.bundle、.xib? 世囊、.storyboard文件别瞭、圖片asset文件等一起復(fù)制進(jìn)去,所以我們新建一個(gè)New Run Script Phase, 并將它放置在Copy Bundle Resources之上株憾。
腳本的思路是:
1蝙寨、從xcassets中刪除上一個(gè)定制版的資源圖片
2、把本次需要運(yùn)行的定制版的圖片復(fù)制到xcassets中去嗤瞎,由于平時(shí)在xcassets中每添加一張圖片墙歪,xcode都會(huì)在資源目錄下自動(dòng)創(chuàng)建一個(gè)content.json文件(如圖所示),里面包含了對(duì)應(yīng)的圖片名稱以及比例信息贝奇,所以使用腳本添加圖片時(shí)候還需創(chuàng)建相應(yīng)的json文件虹菲。
由于在腳本中創(chuàng)建并為每個(gè)文件創(chuàng)建一個(gè)content.json文件太麻煩,所以事先我們?cè)诠こ棠夸浵聫?fù)制一個(gè)content.json文件掉瞳,并把json里面的描述改為“filename”為“123”毕源、“scale”為“2x”髓帽。
在腳本中只要進(jìn)行把這個(gè)json文件在每張圖片目錄下復(fù)制一份,并把json中的文件名改為對(duì)應(yīng)的圖片名即可脑豹。
下面是完整的腳本代碼:
echo -e "\n==== Start Copy Channel Resource ===\n"
##
## Copy Channel Resource Script
##
#---------------- Channel Config 路徑 ----------------------------------------------------------------
ChannelConfigFolderPath="${SRCROOT}/ChannelConfig" #定制版文件夾路徑
ChannelName="123" #渠道名稱
ChannelResourceFullPath="${ChannelConfigFolderPath}/${ChannelName}" #對(duì)應(yīng)的資源路徑
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 "刪除現(xiàn)有資源:${fileDir}"
rm -r ${fileDir}
fi
done
#將定制版的資源圖片轉(zhuǎn)化為xcode能夠識(shí)別的格式
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”文件夾郑藏,并進(jìn)入該文件夾
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
#復(fù)制定制版資源文件到工程Assets
cp -r ${AppChannelResource} "${TargetAssetsFullPath}/${ReSourceDirName}"
把腳本拉進(jìn)去工程剛才新建的Build Phases之中,注意開放腳本文件的權(quán)限
點(diǎn)擊Run瘩欺,可以在xcassets中看到三張圖片已經(jīng)被替換必盖,并且在finder中生成了對(duì)應(yīng)的content.json文件。
最后是更換圖片前后運(yùn)行的效果
另外appicon與啟動(dòng)頁(yè)也可以采用同樣的方法來(lái)進(jìn)行更換俱饿。