在实际开发过程中,经常会遇到使用一个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与启动页也可以采用同样的方法来进行更换。