Версия против сборки в Xcode

У меня есть приложение, которое я разработал с Xcode 3 и недавно начал редактировать с Xcode 4. В целевой сводке у меня есть целевая форма приложения iOS с полями: идентификатор, версия, сборка, устройства и цель развертывания. Поле версии пустое, а поле сборки-3.4.0 (которое соответствует версии приложения, когда я все еще редактировал с помощью Xcode 3).

мои вопросы:

  1. в чем разница между поля версии и сборки?

  2. Почему поле версии было пустым после обновления до Xcode 4?

7 ответов


Apple вроде перестроил / переназначил поля.

в дальнейшем, если вы посмотрите на вкладке Info для целевого приложения, вы должны использовать " Bundle versions string, short "в качестве вашей версии (например, 3.4.0) и" Bundle version " в качестве сборки (например, 500 или 1A500). Если вы не видите их обоих, вы можете добавить их. Они будут сопоставляться с правильной версией и создавать текстовые поля на вкладке сводка; это те же значения.

при просмотре вкладки Info, Если вы щелкните правой кнопкой мыши и выберите Показать Необработанные Ключи / Значения, вы увидите реальные имена CFBundleShortVersionString (версия) и CFBundleVersion (сборка).

версия обычно используется так, как вы, похоже, использовали ее с Xcode 3. Я не уверен, на каком уровне вы спрашиваете о разнице версии/сборки, поэтому я отвечу на это философски.

есть всевозможные схемы, но одна популярная есть:

{MajorVersion}.{MinorVersion}.{Revision}

  • основная версия - основные изменения, редизайны и функциональность изменения
  • версии - незначительные улучшения, дополнения к функциональности
  • редакция - патч номер для исправления ошибок

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

многие разработчики начинают Номер сборки с 0, и каждый раз, когда они строят, они увеличивают число на один, увеличивая навсегда. В моих проектах, у меня есть скрипт, который автоматически увеличивает номер сборки каждый раз, когда я строить. См. инструкции для этого ниже.

  • выпуск 1.0.0 может быть build 542. Потребовалось 542 сборки, чтобы добраться до Релиз 1.0.0.
  • выпуск 1.0.1 может быть сборкой 578.
  • выпуск 1.1.0 может быть построен 694.
  • выпуск 2.0.0 может быть build 949.

другие разработчики, включая Apple, имеют номер сборки, состоящий из основной версии + минорной версии + количество сборок для выпуска. Это фактические номера версий программного обеспечения, в отличие от значений, используемых для маркетинга.

если вы идете к в Xcode меню > О Xcode, вы увидите версию и номер сборки. Если вы нажмете Подробнее... кнопку вы увидите кучу разных версий. С Подробнее... кнопка была удалена в Xcode 5, эта информация также доступна из Программное Обеспечение > Разработчик на Сведения О Системе приложение, доступное при открытии Яблоко меню > Об Этом Mac>Отчет О Системе....

например, Xcode 4.2 (4C139). Маркетинговая версия 4.2-Build major version 4, Build minor C версии и номер сборки 139. Следующий релиз (предположительно 4.3), скорее всего, будет build release 4D, и номер сборки начнется с 0 и увеличится оттуда.

версия симулятора iPhone / номера сборки такие же, как iPhones, Macs и т. д.

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4.3: (8H7)

обновление: By запрос, вот шаги для создания сценария, который запускается каждый раз, когда вы создаете приложение в Xcode, чтобы прочитать номер сборки, увеличить его и записать его обратно в. Есть дополнительные дополнительные шаги, если вы хотите записать свои номера версии/сборки в свой (ы).

это расширено от инструкции к статье здесь.

В Xcode 4.2 - 5.0:

  1. загрузите проект Xcode.
  2. в левая панель, нажмите на свой проект в самой верхней части иерархии. Это загрузит редактор параметров проекта.
  3. в левой части центральной панели окна нажмите на свое приложение под цели заголовок. Вам нужно будет настроить эту настройку для каждой цели проекта.
  4. выберите Собрать Фаз tab.
    • в Xcode 4, в правом нижнем углу, нажмите Добавить Фазу Сборки и выберите Добавить Скрипт Запуска.
    • в Xcode 5, выберите редактор меню > Добавить Фазу Сборки>Добавить Этап Сборки Сценария Запуска.
  5. перетащите новый Выполнить Скрипт фаза, чтобы переместить его непосредственно перед Копия Пакета Ресурсов фаза (когда приложения-информация.plist файл будет в комплекте с вашим приложением).
  6. новый Выполнить Скрипт этап, набор Shell: /bin/bash.
  7. скопируйте и вставьте следующее в область скрипта для целых чисел сборки:

    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
    

    как отметил @Bdebeez,Apple Generic Инструмент Управления Версиями (agvtool) также доступна. Если вы предпочитаете использовать его вместо этого, то есть несколько вещей, чтобы изменить в первую очередь:

    • выберите Параметры Построения tab.
    • под версионность раздел, выберите Текущая Версия Проекта к исходному номеру сборки, который вы хотите использовать, например,1.
    • обратно на Собрать Фаз tab, перетащите и падение вашего Выполнить Скрипт этап после Копия Пакета Ресурсов фаза, чтобы избежать состояния гонки при попытке как построить, так и обновить исходный файл, который включает номер сборки.

    обратите внимание, что с agvtool метод может по-прежнему периодически получать неудачные/отмененные сборки без ошибок. По этой причине, я не рекомендую использовать agvtool С помощью этого скрипта.

    тем не менее, в своем Выполнить Скрипт этап, вы можете использовать следующий скрипт:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all
    

    на


(просто оставляя это здесь для моей собственной справки.) Это покажет версию и сборку для полей" версия "и" сборка", которые вы видите в цели Xcode:

- (NSString*) version {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

В Swift

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as? String
    let build = dictionary["CFBundleVersion"] as? String
    return "\(version) build \(build)"
}

номер сборки-это внутренний номер, который указывает текущее состояние приложения. Он отличается от номера версии тем, что он обычно не сталкивается с пользователем и не обозначает никакой разницы/функций/обновлений, как обычно номер версии.

подумайте об этом так:

  • Build (CFBundleVersion): номер сборки. Обычно вы начинаете это с 1 и увеличивается на 1 с каждой сборки приложения. Это быстро позволяет Для сравнения которых build более недавний и он обозначает чувство прогресса кодовой базы. Они могут быть чрезвычайно ценными при работе с QA и должны быть уверены, что ошибки регистрируются против правильных сборок.
  • Маркетинговый Версии (CFBundleShortVersionString): номер пользователя, который вы используете для обозначения этой версии вашего приложения. Обычно это следует за майором.схема малой версии (например, MyAwesomeApp 1.2), чтобы пользователи знали, какие выпуски являются меньшими обновлениями обслуживания, а какие-новыми особенности.

чтобы эффективно использовать это в своих проектах, Apple предоставляет отличный инструмент под названием agvtool. я настоятельно рекомендую использовать это, так как это намного проще, чем сценарии изменений plist. это позволяет легко установить как номер сборки, так и маркетинговую версию. Это особенно полезно при написании сценариев (например, легко обновлять номер сборки в каждой сборке или даже запрашивать текущий номер сборки). Он может даже делать более экзотические вещи например, пометьте свой SVN для вас при обновлении номера сборки.

использовать:

  • установите проект в Xcode в разделе Управление версиями, чтобы использовать "Apple Generic".
  • в терминале
    • agvtool new-version 1 (установите Номер сборки в 1)
    • agvtool new-marketing-version 1.0 (установите маркетинговую версию в 1.0)

см. справочную страницу agvtool для тонны хорошей информации


скрипт для автоинкремента номера сборки в ответе выше не работал для меня, если номер сборки является значением с плавающей запятой, поэтому я немного изменил его:

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=`echo $buildNumber +1|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

номер маркетингового релиза предназначен для клиентов, называемых номер версии. Он начинается с 1.0 и поднимается для основных обновлений до 2.0, 3.0, для незначительных обновлений до 1.1, 1.2 и для исправления ошибок 1.0.1, 1.0.2 . Это число ориентировано на выпуски и новые функции.

на номер сборки в основном внутреннее количество сборок это было сделано до тех пор. Но некоторые используют другие номера, такие как номер ветви репозитория. Это число должно быть уникальный чтобы различать разные почти одинаковые сборки.

Как видите,номер сборки не нужно, и это зависит от вас, который номер сборки вы хотите использовать. Поэтому, если вы обновите свой Xcode к основной версии,построить


спасибо @nekno и @ale84 за отличные ответы.

однако я изменил скрипт @ale84, чтобы немного увеличить числа сборки для плавающей точки.

значение инкл можно изменить согласно вашим плавая требованиям к формата. Например: if incl = .01, формат будет ... 1.19, 1.20, 1.21 ...

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

другой способ-установить номер версии в appDelegate didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application         didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     NSString * ver = [self myVersion];
     NSLog(@"version: %@",ver);

     NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:ver forKey:@"version"];
     return YES;
}

- (NSString *) myVersion {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}