![](https://habrastorage.org/files/d67/4c1/19f/d674c119f3164b7baefe8c21b98ca99d.png)
В процессе разработки приложение тестируется, и бывает, что нужно знать, какая версия приложения и с каким номером сборки у тестировщика/другого участника процесса установлена. Например, баг уже исправлен, а человек новый билд ещё не поставил и сетует, что ничего не исправлено.
Зачастую эту информацию прячут где-нибудь, например, в приложении Яндекс.Маркет, нужно ткнуть в раздел Кабинет и выбрать пункт «О приложении»:
Пример![](https://habrastorage.org/r/w1560/files/d0f/fd1/a81/d0ffd1a8104b4f3d86ddb423d4750968.png)
![](https://habrastorage.org/files/d0f/fd1/a81/d0ffd1a8104b4f3d86ddb423d4750968.png)
Для удобства (или потому, что этот экран ещё не готов), можно вынести эту полезную информацию прямо на иконку приложения.
1. Ставим необходимые пакеты из Homebrew:
brew install imagemagick
brew install ghostscript
2. Открываем наш проект в Xcode, открываем наш Images.xcassets, выбираем AppIcon и смотрим, где лежат и как называются файлы с иконками:
![](https://habrastorage.org/files/057/bf5/423/057bf542397c4b399d84bc36cfbaf8e8.png)
Видим имена файлов, запоминаем:
![](https://habrastorage.org/files/169/cad/795/169cad7952fa4f748a8e453bf66e6e41.png)
В моём случае я буду затрагивать только иконки для Retina-айфонов.
3. Открываем Xcode, идём в настройки нашего таргета в раздел Build Phases, добавляем New Run Script Phase:
![](https://habrastorage.org/files/078/242/edc/078242edc7b340d184a6b3bdbe2b22da.png)
4. Вставляем в блок Run Script код:
# если у нас релизная сборка, то нам нужна обычная иконка
if [ $CONFIGURATION = "Release" ]; then
exit
fi
# номер версии
version=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${INFOPLIST_FILE}"`
# номер билда
build=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_FILE}"`
# если нужно, можно взять имя ветки из git
branch=`git rev-parse --abbrev-ref HEAD`
# функция генерации иконки
function processIcon() {
export PATH=$PATH:/usr/local/bin
base_file=$1
target_icon_name=$2
base_path=`find ${SRCROOT} -name $base_file`
if [[ ! -f ${base_path} || -z ${base_path} ]]; then
return;
fi
target_file=`echo $target_icon_name | sed "s/_base//"`
target_path="${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${target_file}"
width=`identify -format %w ${base_path}`
echo $target_path
echo $target_file
convert -background '#0008' -fill white -gravity center -size ${width}x40 -pointsize 26\
caption:"${version} (${build})"\
"${base_path}" +swap -gravity south -composite "${target_path}"
}
# запускаем генерацию
processIcon "ewrw_120-1.png" "AppIcon60x60@2x.png"
processIcon "ewrw_180.png" "AppIcon60x60@3x.png"
Готово. Когда проект собирается, если иконки приложения лежат в Images.xcassets, то внутри file.app они имеют после билда имена вида AppIcon60x60@2x.png, AppIcon60x60@3x.png и т.д. Эти то имена и испльзуются в последних 2 строчках. Нужно просто подставить имена файлов ваших иконок.
В результате, когда мы собираем дебажный билд, иконка подменяется новой, с наложенным внизу номером версии и номером билда:
![](https://habrastorage.org/files/d67/4c1/19f/d674c119f3164b7baefe8c21b98ca99d.png)
Надеюсь, кому-то такая мелочь тоже будет полезна.
P.S. Информацию взял и немного допилил отсюда (там для варианта, когда ассеты не используются).
Полезное (в том числе и в комментах): «Автоматическое увеличение номера сборки в Xcode»