При передаче приложения тестировщикам или конечным пользователям не стоит забывать увеличивать версию проекта / номера сборки для того, чтобы в будущем можно было без проблем идентифицировать установленное приложение.
Память, как известно, бывает подводит. Здесь на помощь приходит простой и действенный чудо-рецепт автоматической установки номера сборки проекта.
Готовый проект с кратким описанием доступен на github: github.com/eshurakov/XcodeAutoBundleVersion
Для установки версии приложения в распоряжении разработчика имеются две переменные:
CFBundleShortVersionString | Маркетинговая версия, отображаемая в магазине приложений. Представляет собой строку, состоящую из трех чисел, разделенных точкой. Обозначает итерацию выпущенного приложения. Данную версию я всегда меняю вручную. |
CFBundleVersion | Номер сборки. Представляет собой монотонно возрастающую строку, состоящую из одного или нескольких чисел, разделенных точкой. Обозначает итерацию выпущенного или разрабатываемого приложения. |
Подбробнее можно прочитать в документации, предоставленной Apple: developer.apple.com/library/mac/#documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
Все мы пользуемся системами контроля версий при разработке, поэтому очевидным решением будет в качестве номера сборки использовать номер последней ревизии.
- Для пользователей SVN все просто, номер ревизии есть в открытом виде.
- Для пользователей GIT все не так просто, хэш последнего коммита мы использовать не можем из-за ограничений на формат номера сборки. Но выход есть! Предполагая, что у проекта есть стабильная ветка, история которой не отматывается назад, в качестве номера сборки будем использовать число коммитов в этой ветке.
Номер сборки:
> git rev-list master | wc -l > 43
Хэш коммита по номеру сборки:
> git rev-list --abbrev-commit --reverse master | sed -n '43 p' > 5a09ebc
- О пользователях других систем контроля версий я, к сожалению, не позаботился :)
Настройка проекта за 6 простых шагов:
- Сохраняем скрипт в папку с проектом. Этот скрипт вычисляет номер сборки и записывает его в переданный файл.
- В проекте создаем новый Target с типом Aggregate. Я назвал свой «Version». В Build Phases добавляем Run Script Phase, откуда вызываем наш скрипт:
GIT_BRANCH="master" PREFIX="XC_" /bin/sh "${PROJECT_DIR}/Version.sh" "${PROJECT_DIR}/Version.h"
Переменные окружения, используемые скриптом:
PREFIX Префикс сгенерированных констант, может отсутстововать. GIT_BRANCH Ветка репозитория git, для которой считается номер сборки. По умолчанию «master». PROJECT_DIR Путь до папки проекта. При запуске скрипта из Xcode данная переменная уже установлена. Пример полученного заголовочного файла:
#define XC_BUILD_NUMBER 7 #define XC_BUILD_HASH @"c2acb9b"
Мы будем использовать его для формирования Info.plist файла проекта в момент компиляции. Его также можно подключить в проект и использовать на свое усмотрение, например, выводить хэш коммита на экране «О приложении».
- Вносим правки в Build Settings основного Target:
Preprocess Info.plist File YES Info.plist Preprocessor Prefix File Version.h - В Info.plist меняем значение
CFBundleVersion
наXC_BUILD_NUMBER
- Добавляем свежесозданный Aggregate Target как зависимость к нашему основному Target.
- Файл Version.h добавляем в игнор лист системы контроля версий.
Теперь, при каждой сборке проекта файл Version.h будет обновляться, а вместе с ним и Info.plist.
Тестовый проект на github: github.com/eshurakov/XcodeAutoBundleVersion
Автор: lunatic