В процессе разработки приложение тестируется, и бывает, что нужно знать, какая версия приложения и с каким номером сборки у тестировщика/другого участника процесса установлена. Например, баг уже исправлен, а человек новый билд ещё не поставил и сетует, что ничего не исправлено.

Зачастую эту информацию прячут где-нибудь, например, в приложении Яндекс.Маркет, нужно ткнуть в раздел Кабинет и выбрать пункт «О приложении»:

Пример

Для удобства (или потому, что этот экран ещё не готов), можно вынести эту полезную информацию прямо на иконку приложения.

1. Ставим необходимые пакеты из Homebrew:

brew install imagemagick
brew install ghostscript

2. Открываем наш проект в Xcode, открываем наш Images.xcassets, выбираем AppIcon и смотрим, где лежат и как называются файлы с иконками:



Видим имена файлов, запоминаем:



В моём случае я буду затрагивать только иконки для Retina-айфонов.

3. Открываем Xcode, идём в настройки нашего таргета в раздел Build Phases, добавляем New Run Script Phase:



4. Вставляем в блок Run Script код:

# если у нас релизная сборка, то нам нужна обычная иконка
if [ $CONFIGURATION = "Release" ]; then
return
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 строчках. Нужно просто подставить имена файлов ваших иконок.

В результате, когда мы собираем дебажный билд, иконка подменяется новой, с наложенным внизу номером версии и номером билда:



Надеюсь, кому-то такая мелочь тоже будет полезна.

P.S. Информацию взял и немного допилил отсюда (там для варианта, когда ассеты не используются).

Полезное (в том числе и в комментах): «Автоматическое увеличение номера сборки в Xcode»

Комментарии (7)


  1. barsuga
    15.07.2015 15:54
    +1

    Спасибо, берем метод в работу :) Вопрос билдов для приложений очень актуален.
    На практике, как ни странно, для тестировщика бывает удобно видеть даже не номер сборки, а дату билда. Так и заказчик, и тестировщик в процессе разработки проекта быстро понимают кто на что смотрит.


  1. alkozin
    15.07.2015 16:25
    +1

    Отличное решение, попробую на своих проектах.


  1. Wicked
    15.07.2015 18:56
    +1

    Спасибо. Думаю приживется.


  1. InstaRobot
    15.07.2015 23:33

    Интересная фишка, но хочу задать вопрос по скрину Яндекс.Маркета! Откуда он? Я там вижу, что ТЕЛЕ2 использует ЛТЕ. Я наверное что то пропустил, но данный сотовый оператор лишь недавно начал 3G к своей сети прикручивать.


    1. Makaveli Автор
      16.07.2015 00:12

      TELE2 в июне запустил LTE в Санкт-Петербурге


      1. InstaRobot
        16.07.2015 00:24

        Интересная информация. Спасибо. А то я думал, что фейк на скрине


  1. 11101010
    16.07.2015 11:55

    deleted