Как стать автором
Обновить

Автоматическое обновление номера сборки проекта в Xcode

Время на прочтение3 мин
Количество просмотров6.6K
При передаче приложения тестировщикам или конечным пользователям не стоит забывать увеличивать версию проекта / номера сборки для того, чтобы в будущем можно было без проблем идентифицировать установленное приложение.

Память, как известно, бывает подводит. Здесь на помощь приходит простой и действенный чудо-рецепт автоматической установки номера сборки проекта.

Готовый проект с кратким описанием доступен на 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 простых шагов:


  1. Сохраняем скрипт в папку с проектом. Этот скрипт вычисляет номер сборки и записывает его в переданный файл.
  2. В проекте создаем новый 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 файла проекта в момент компиляции. Его также можно подключить в проект и использовать на свое усмотрение, например, выводить хэш коммита на экране «О приложении».

  3. Вносим правки в Build Settings основного Target:
    Preprocess Info.plist File
    YES
    Info.plist Preprocessor Prefix File
    Version.h

  4. В Info.plist меняем значение CFBundleVersion на XC_BUILD_NUMBER
  5. Добавляем свежесозданный Aggregate Target как зависимость к нашему основному Target.
  6. Файл Version.h добавляем в игнор лист системы контроля версий.


Теперь, при каждой сборке проекта файл Version.h будет обновляться, а вместе с ним и Info.plist.

Тестовый проект на github: github.com/eshurakov/XcodeAutoBundleVersion
Теги:
Хабы:
Всего голосов 12: ↑10 и ↓2+8
Комментарии16

Публикации

Истории

Работа

Swift разработчик
31 вакансия
iOS разработчик
24 вакансии

Ближайшие события