0,0
рейтинг
15 июля 2015 в 14:09

Разработка → Генерируем номер версии и билда на иконке iOS приложения



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

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

Пример

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

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
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 строчках. Нужно просто подставить имена файлов ваших иконок.

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



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

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

Полезное (в том числе и в комментах): «Автоматическое увеличение номера сборки в Xcode»
Сергей Армодин @Makaveli
карма
72,7
рейтинг 0,0
iOS Developer
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • +1
    Спасибо, берем метод в работу :) Вопрос билдов для приложений очень актуален.
    На практике, как ни странно, для тестировщика бывает удобно видеть даже не номер сборки, а дату билда. Так и заказчик, и тестировщик в процессе разработки проекта быстро понимают кто на что смотрит.
  • +1
    Отличное решение, попробую на своих проектах.
  • +1
    Спасибо. Думаю приживется.
  • 0
    Интересная фишка, но хочу задать вопрос по скрину Яндекс.Маркета! Откуда он? Я там вижу, что ТЕЛЕ2 использует ЛТЕ. Я наверное что то пропустил, но данный сотовый оператор лишь недавно начал 3G к своей сети прикручивать.
    • 0
      TELE2 в июне запустил LTE в Санкт-Петербурге
      • 0
        Интересная информация. Спасибо. А то я думал, что фейк на скрине
  • 0
    deleted
  • 0
    Круто, конечно.
    Только скрипт для продакшена тоже иконку покорежит.
    В скрипте return не работает, должен быть exit.
    • 0
      Исправил :)

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