Версия vs для сборки в XCode

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

Мои вопросы:

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

  • Почему поле версии было пустым после моего обновления до XCode 4?

Спасибо.

Ответ 1

Яблоко вроде перегруппировало/перепрофилировало поля.

Идти вперед, если вы посмотрите на вкладке "Информация" для своей целевой задачи, вы должны использовать "Версия версий Bundle, короткую" в качестве вашей версии (например, 3.4.0) и "Bundle version" в качестве вашей сборки (например, 500 или 1A500). Если вы не видите их обоих, вы можете их добавить. Они будут отображаться в соответствующие текстовые поля Version и Build на вкладке "Сводка"; они являются одинаковыми значениями.

При просмотре вкладки "Информация", если вы щелкните правой кнопкой мыши и выберите Показать исходные клавиши/значения, вы увидите фактические имена CFBundleShortVersionString (Версия) и CFBundleVersion (Build).

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

Существуют разные схемы, но популярный:

{MajorVersion}. {MinorVersion}. {} Редакция

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

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

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

  • Версия 1.0.0 может быть построена 542. Для доступа к 1.0.0.
  • Версия 1.0.1 может быть построена 578.
  • Версия 1.1.0 может быть построена 694.
  • Версия 2.0.0 может быть создана 949.

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

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

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

Версия iPhone Simulator Version/Build одинаковы, как и iPhone, Mac и т.д.

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

Обновить. По запросу выполните следующие действия: script, который запускается каждый раз, когда вы создаете приложение в Xcode, чтобы прочитать номер сборки, увеличить его и записать обратно в app {App}-Info.plist. Существуют дополнительные, дополнительные шаги, если вы хотите записать свои номера версий/сборки в ваши файлы Settings.bundle/Root*.plist.

Это расширено от практической статьи здесь.

В Xcode 4.2 - 5.0:

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

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

    Как отметил @Bdebeez, доступен Apple Generic Versioning Tool (agvtool). Если вы предпочитаете использовать его вместо этого, то сначала необходимо изменить пару вещей:

    • Выберите вкладку Настройки сборки.
    • В разделе Версии установите Текущая версия проекта в исходный номер сборки, который вы хотите использовать, например 1.. li >
    • Вернитесь на вкладку Сборка факс, перетащите и отпустите Запуск Script, после фазы Копировать ресурсы ресурса, чтобы избежать условие гонки при попытке создать и обновить исходный файл, который содержит ваш номер сборки.

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

    Тем не менее, на этапе Выполнить Script вы можете использовать следующие script:

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

    Аргумент next-version увеличивает номер сборки (bump также является псевдонимом для одной и той же вещи) и -all обновляет Info.plist с новым номером сборки.

  • И если у вас есть набор настроек, в котором вы показываете версию и сборку, вы можете добавить следующее в конец script для обновления версии и сборки. Примечание. Измените значения PreferenceSpecifiers в соответствии с вашими настройками. PreferenceSpecifiers:2 означает просмотр элемента по индексу 2 в массиве PreferenceSpecifiers в вашем файле plist, поэтому для индекса с индексом 0 это параметр 3-й настройки в массиве.

    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    

    Если вы используете agvtool вместо прямого чтения Info.plist, вы можете добавить вместо этого script следующее:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
    productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    
  • И если у вас есть универсальное приложение для iPad и iPhone, вы также можете установить настройки для файла iPhone:

    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root~iphone.plist
    

Ответ 2

(просто оставив это здесь для моей справки.) Это покажет версию и построит для полей "версия" и "сборка", которые вы видите в цели 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)"
}

Ответ 3

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

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

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

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

Чтобы использовать его:

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

См. справочную страницу agvtool за тонну хорошей информации

Ответ 4

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

#!/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"

Ответ 5

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

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

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


Чтобы получить номер build как переменную NSString:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Чтобы получить версию в качестве переменной NSString:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

Если вы хотите оба в одном NSString:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Это протестировано с Xcode Version 4.6.3 (4H1503). Номер сборки часто записывается в скобки/фигурные скобки. Номер сборки находится в шестнадцатеричном или десятичном формате.

buildandversion


В Xcode вы можете автоматически увеличивать номер сборки как десятичное число, разместив на этапе сборки Run script следующее: настройки проекта

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

Для номера сборки шестнадцатеричного используйте этот script

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

project_settings

Ответ 6

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

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

значение вкл может быть изменено в соответствии с вашими требованиями к формату плавающего формата. Например: 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"

Ответ 7

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

- (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];
}