使用脚本管理xcode多渠道图片资源

在实际开发过程中,经常会遇到使用一个xcode工程来管理多个渠道定制版的情况,这些定制版往往代码都大部分相同,差别可能在于每个页面上面的UI、切图不一样~,如果我们把每个定制版不同的切图全部放进工程里面,这样打包出来的安装文件ipa就会增加额外的大小,所以这篇文章就是介绍在编译时怎样利用一个简单的脚本把多余的定制版资源去掉。

新建一个工程,在TARGETS——Build Phases下我们看到�下方的是xcode在构建阶段的顺序,无论是平时在Build、Run、或是Archive的时候都会按顺序执行下面的几项。最后一项是Copy Bundle Resources,会将项目中的.bundle、.xib� 、.storyboard文件、图片asset文件等一起复制进去,所以我们新建一个New Run Script Phase, 并将它放置在Copy Bundle Resources之上。

96CA0069-9FEB-4699-91AD-7D673AE3E0CA.png
597652B3-C16F-409E-80CA-2534F5D59751.png

脚本的思路是:
1、从xcassets中删除上一个定制版的资源图片
2、把本次需要运行的定制版的图片复制到xcassets中去,由于平时在xcassets中每添加一张图片,xcode都会在资源目录下自动创建一个content.json文件(如图所示),里面包含了对应的图片名称以及比例信息,所以使用脚本添加图片时候还需创建相应的json文件。

15FE66C6-F48D-496B-8C74-26BC4D5D352F.png

由于在脚本中创建并为每个文件创建一个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之中,注意开放脚本文件的权限

B923C8CE-927D-4F04-8664-D1167F8C5F0A.png

点击Run,可以在xcassets中看到三张图片已经被替换,并且在finder中生成了对应的content.json文件。

A4A55010-2FB6-4966-967D-FFB7B362060D.png
CD9E9F90-B026-440D-822C-E4365D185FDA.png

最后是更换图片前后运行的效果


7AEB63FD-2DA2-456B-8351-0319FC87CD59.png

另外appicon与启动页也可以采用同样的方法来进行更换。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容