Change Your App Icon at build time

需求背景

为了区分线上版本、测试版本以及调试版本,我们在开发过程中一般会修改bunlde Id以便在一个设备上安装不同版本的App。然而问题来了,如何快速区分出桌面上的App是什么版本呢?最直观的就是改变App图标,达到显而易见的目的。


在看了这篇译文后,利用脚本可以非常便利的实现这个需求(这是原文)。虽然译文翻译有些问题,但还是确实让大家能伸手一把(原文作者真心是手把手教学)。

实际工作

实际上,原文中对脚本解释的非常清楚,我这里简单记录下,顺便提一下注意点。

实现原理:在Xcode下build时,运行一个shell脚本,使用ImageMagick这个图像处理软件套件进行图标转换和组合,替换掉原本设置的AppIcon。

实现步骤

  • 使用brew安装ImageMagick brew install ImageMagick
  • 安装Ghostscript brew install ghostscript 它提供了支持ImageMagick的字体
  • 将需要组合的调试图片放到项目根目录
  • 将以下脚本加入到项目中
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
27
28
29
30
31
32
33
34
35
IFS=$'\n'
echo "ready change app icon"
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
versionNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
echo "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
echo "${SRCROOT}"
echo $(find ${SRCROOT} -name "AppIcon76x76@2x~ipad.png")
PATH=${PATH}:/usr/local/bin
function changeAppIcon () {
BASE_IMAGE_NAME=$1
TARGET_PATH="${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${BASE_IMAGE_NAME}"
BASE_IMAGE_PATH=$(find ${SRCROOT} -name ${BASE_IMAGE_NAME})
WIDTH=$(identify -format %w ${BASE_IMAGE_PATH})
FONT_SIZE=$(echo "$WIDTH * .2" | bc -l)
echo "CFBundleVersion = $buildNumber"
echo "CFBundleShortVersionString = $versionNumber"
if [ "${CONFIGURATION}" == "Debug" ]; then
convert debugRibbon.png -resize $WIDTHx$WIDTH resizedRibbon.png
convert ${BASE_IMAGE_PATH} -fill white -font Times-Bold -pointsize ${FONT_SIZE} -gravity south -annotate 0 "$buildNumber" - | composite resizedRibbon.png - ${TARGET_PATH}
fi
if [ "${CONFIGURATION}" == "AdHoc" ]; then
convert betaRibbon.png -resize $WIDTHx$WIDTH resizedRibbon.png
convert ${BASE_IMAGE_PATH} -fill white -font Times-Bold -pointsize ${FONT_SIZE} -gravity south -annotate 0 "$buildNumber" - | composite resizedRibbon.png - ${TARGET_PATH}
fi
}
changeAppIcon "AppIcon76x76@2x~ipad.png"
changeAppIcon "AppIcon76x76~ipad.png"
changeAppIcon "AppIconx40x40@2x~ipad.png"
changeAppIcon "AppIcon40x40~ipad.png"
changeAppIcon "AppIcon29x29@2x~ipad.png"
changeAppIcon "AppIcon29x29~ipad.png"
echo "finish"

需要注意的几点有

  • 路径问题(可以看到以上脚本跟原文中的有些差别)
  • 图片名称,需要修改项目中AppIcon的命名
  • 获取编译构建号,根据不同版本写入AppIcon中

最后效果类似下图

在这里再分享个根据githash更新编译构建号的脚本

1
2
3
4
5
6
7
8
Githash=$(git --git-dir="${PROJECT_DIR}/.git" --work-tree="${PROJECT_DIR}" rev-parse --short HEAD)
RevisionNumber=$(git rev-list --count HEAD)
BuildTimestamp=$(date +'%Y-%m-%d %H:%M')
GitCommit=
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $RevisionNumber" "$INFOPLIST_FILE"
/usr/libexec/PlistBuddy -c "Set :BuildTimestamp $BuildTimestamp" "$INFOPLIST_FILE"
/usr/libexec/PlistBuddy -c "Set :GitCommit $Githash" "$INFOPLIST_FILE"

后续

目前该功能已经集成到项目中,配合jenkins集成打包,各种轻松无压力~
以后可以在此基础上加一些其他功能,等需要时再加上咯。