Версия против сборки в Xcode - PullRequest
635 голосов
/ 28 июля 2011

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

Мои вопросы:

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

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

Ответы [ 7 ]

1193 голосов
/ 06 августа 2011

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

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

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

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

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

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

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

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

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

  • Релиз 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 такие же, как и iPhone, Mac и т. Д.

  • 3.2: (7W367a)
  • 4,0: (8A400)
  • 4,1: (8B117)
  • 4,2: (8C134)
  • 4,3: (8H7)

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

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

В Xcode 4.2 - 5.0:

  1. Загрузите ваш проект Xcode.
  2. В левой панели щелкните ваш проект в самом верху иерархии. Это загрузит редактор настроек проекта.
  3. В левой части центральной панели окна щелкните свое приложение под заголовком TARGETS . Вам нужно будет настроить эту настройку для каждой цели проекта.
  4. Выберите вкладку Фазы сборки .
    • В Xcode 4 в правом нижнем углу нажмите кнопку Add Build Phase и выберите Add Run Script .
    • В Xcode 5 выберите Редактор menu> Добавить этап сборки > Добавить этап запуска сценария сборки .
  5. Перетащить и отпустить новый Запустите этап Script , чтобы переместить его непосредственно перед этапом Copy Bundle Resources (когда файл app-info.plist будет связан с вашим приложением).
  6. В новом Выполнить сценарий фаза, установить Оболочка : /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 (agvtool).Если вы предпочитаете использовать его вместо этого, то сначала нужно изменить несколько параметров:

    • Выберите вкладку Настройки сборки .
    • Под В разделе управления версиями установите Текущую версию проекта на начальный номер сборки, который вы хотите использовать, например, 1 .
    • Вернитесь к BuildЗакладка Phases , перетащите и отпустите вашу Run Script фазу после фазы Copy Bundle Resources , чтобы избежать условия гонки при попытке создать и обновить исходный файл, который включает в себяВаш номер сборки.

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

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

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

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

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

    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 напрямую, вы можете вместо этого добавить в свой скрипт следующее:

    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
    
  9. И если у вас есть универсальное приложениедля 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
    
71 голосов
/ 05 сентября 2011

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

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

In 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)"
}
51 голосов
/ 24 декабря 2012

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

Думайте об этом так:

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

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

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

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

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

25 голосов
/ 08 февраля 2012

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

#!/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"
21 голосов
/ 28 октября 2013

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

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

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


Чтобы получить число 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"

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

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 голосов
/ 02 февраля 2014

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

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

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

Другой способ - установить номер версии в 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...