ios - setup - uinavigationcontroller title




Версия vs для сборки в Xcode (5)

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

Мои вопросы:

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

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


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

Другой способ - установить номер версии в 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];
}

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

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

  • Build ( 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 страницу 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"

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

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

При просмотре вкладки «Информация», если вы щелкните правой кнопкой мыши и выберите « Показать Raw Keys / Values» , вы увидите, что фактические имена - это CFBundleShortVersionString (Version) и CFBundleVersion (Build).

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

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

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

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

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

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

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

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

Если вы перейдете в меню Xcode > About Xcode , вы увидите номера версии и сборки. Если вы нажмете кнопку More Info ... , вы увидите кучу разных версий. Так как кнопка « Подробнее ...» была удалена в 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: (8А400)
  • 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 в правом нижнем углу нажмите кнопку « Добавить этап сборки» и выберите « Добавить сценарий запуска» .
    • В Xcode 5 выберите меню « Редактор» > « Добавить этап сборки» > « Добавить этап сборки сценария запуска» .
  5. Перетащите новую фазу сценария запуска, чтобы переместить ее непосредственно перед фазой « Копирование резервных копий» (когда файл app-info.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"
    

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

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

    Обратите внимание, что с agvtool метода 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 вместо 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
    




xcode