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

в 7:43, , рубрики: Cocoa, version control, xcode, разработка под iOS, метки: ,

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

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

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

Автор: lunatic

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js