Версія проти побудови в Xcode


660

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

Мої запитання:

  1. Яка різниця між версіями та полями збірки?

  2. Чому після оновлення до Xcode 4 було поле порожнім?


По-перше, я думаю, що номер збірки відображається у списку архівів організаторів Xcode. Крім цього, я не впевнений, для чого він використовується.
Даніель Дікісон

Відповіді:


1224

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

Вперед, якщо ви подивитесь на вкладку "Інформація" для вашої цілі програми, ви повинні використовувати "Ваша версія (наприклад, 3.4.0)" та "Версія пакета" для своєї збірки (наприклад, 500 або 1A500) ). Якщо ви не бачите їх обох, можете додати їх. Вони будуть відображати відповідні текстові поля Версія та Створювати на вкладці Зведення; вони однакові значення.

Переглядаючи вкладку Інформація, якщо ви клацніть правою кнопкою миші та виберіть Показати неочищені ключі / цінності , ви побачите фактичні назви CFBundleShortVersionString(Версія) та CFBundleVersion(Збірка).

Версія зазвичай використовується тим, як, здається, ви використовуєте її з Xcode 3. Я не впевнений, на якому рівні ви запитуєте про різницю Version / Build, тому я відповім на це по-філософськи.

Існують всілякі схеми, але популярною є:

{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 , ви побачите номери версій та збірок. Якщо ви натиснете кнопку " Більше інформації ...", ви побачите купу різних версій. Оскільки Детальніше ... кнопка була видалена в Xcode 5, ця інформація також доступна з програмного забезпечення> Developer розділу Інформації про системі додатки, доступна при відкритті компанії Apple меню> About This Mac > System Report ... .

Наприклад, Xcode 4.2 (4C139). Маркетингова версія 4.2 - це основна версія 4, збір незначної версії C та номер збірки 139. Наступним випуском (імовірно, 4.3) буде, ймовірно, випуск Build 4D, а номер збірки починатиметься з 0 і збільшується звідти.

Номери версії / побудови iPhone Simulator - це однаковий спосіб, як і iPhone, Macs тощо.

  • 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. У лівій частині панелі центрального вікна натисніть на додаток під заголовком ЦІЛИ . Вам потрібно буде налаштувати цю настройку для кожної цілі проекту.
  4. Перейдіть на вкладку Фази збірки .
    • У Xcode 4 в нижньому правому куті натисніть кнопку Додати фазу збірки та виберіть Додати запустити сценарій .
    • У Xcode 5 виберіть меню Редактор > Додати фазу збірки > Додати етап запуску сценарію збірки .
  5. Перетягніть нову фазу запустити сценарій, щоб перемістити її безпосередньо перед фазою « Копіювати ресурси ресурсів» (коли файл програми-info.plist буде в комплекті з вашим додатком).
  6. У новому Run Script фази, набір 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 Versioning Tool ( agvtool). Якщо ви віддаєте перевагу використовувати його замість цього, слід спочатку змінити кілька речей:

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

    Зауважте, що за допомогою agvtoolметоду ви все ще можете періодично отримувати збій / скасування збірок без помилок. З цієї причини я не рекомендую використовувати agvtoolцей сценарій.

    Тим не менш, на етапі запуску сценарію ви можете використовувати такий сценарій:

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

    next-versionЗбільшення аргументу номер збірки ( bumpтакож псевдонім для одного і того ж), і -allпоновлення Info.plistз новим номером збірки.

  8. І якщо у вас є комплект налаштувань, де ви показуєте версію та збірку, ви можете додати наступне до кінця сценарію, щоб оновити версію та збірку. Примітка: Змініть PreferenceSpecifiersзначення, щоб відповідати вашим налаштуванням. PreferenceSpecifiers:2означає, що подивіться на елемент в індексі 2 під PreferenceSpecifiersмасивом у вашому файлі плістів, тож для індексу, заснованого на 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

17
"У своїх проектах у мене є сценарій, який автоматично збільшує кількість збірки кожен раз, коли я будую" - ви можете поділитися, як це зробити? дякую за деталі підказки та за оригінальне запитання.
Zsolt

2
@Andrews - я оновив свою відповідь деталями сценарію збирання.
немно

9
Приріст у шістнадцяткових числах ви можете використовуватиbuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") dec=$((0x$buildNumber)) buildNumber=$(($dec + 1)) hex=$(printf "%X" $buildNumber) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $hex" "$INFOPLIST_FILE"
Алон Амір

8
Якщо коротко: HEX заборонено в AppStore.
Nicolas Miari

3
(Xcode 5 користувачів) Можливо, вам потрібно буде змінити крок 5, щоб прочитати: "На панелі меню виберіть Редактор -> Додати фазу збірки -> Додати етап запуску сценаріїв сценарію"
Грег М. Крсак

72

(Просто залиште це тут для моєї власної довідки.) Це покаже версію та збірку для полів "версія" та "build", які ви бачите в цілі Xcode:

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

У Свіфт

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

2
ОТ: У вашому методі є витік - ви alloc/ initрядок, який зберігає рядок, але ви не випускаєте його. На об’єкті, який ви повертаєтесь із методу, зазвичай слід скористатися зручним методом, щоб рядок автоматично вивільнявся або зателефонував autorelease. Або: return [NSString stringWithFormat:@"%@ build %@", version, build]; АБО return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];
немножко

1
Дякую @nekno, змінили відповідь, так що це ARC чи не ARC.
Дан Розенстарк

2
Напевно, краще використовувати константи, де вони доступні (наприклад, kCFBundleVersionKey), щоб уникнути помилок. Хоча я не зміг знайти його для "CFBundleShortVersionString" :)
DannyA

У вас є помилка у швидкому коді - ви телефонуєте CFBundleShortVersionString двічі
Yariv Nissim

Дякую @ yar1vn, я виправив це, і НІ, це не назад.
Дан Розенстарк

53

Номер збірки - це внутрішній номер, який вказує поточний стан програми. Він відрізняється від номера версії тим, що зазвичай не стикається з користувачем і не позначає різниці / особливостей / оновлень, як, наприклад, номер версії.

Подумайте про це так:

  • Build ( CFBundleVersion): кількість збірки. Зазвичай ви починаєте це з 1 і збільшуєте на 1 з кожною збіркою програми. Це швидко дозволяє порівняти, чия збірка є більш пізньою, і вона позначає відчуття прогресу бази даних коду. Вони можуть бути надзвичайно цінними під час роботи з контролем якості та потребуючи впевненості, що помилки реєструються у відповідних побудовах.
  • Маркетингова версія ( 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щоб отримати корисну інформацію


ще одна стаття про agvtool Easy iPhone версії додатків з agvtool
Gon

25

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

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

Номер випуску маркетингу призначений для клієнтів, називається номером версії . Він починається з 1.0 і піднімається для основних оновлень до 2.0 , 3.0 , для незначних оновлень до 1.1 , 1.2 та для виправлень помилок до 1.0.1 , 1.0.2 . Ця кількість орієнтована на випуски та нові функції.

Номер збірки в основному внутрішній номер збірки , що не було зроблено до сих пір. Але деякі використовують інші числа, наприклад номер філії сховища. Це число повинно бути унікальним для розрізнення різних майже однакових складових.

Як бачите, номер збірки не потрібен, і саме ви визначаєте, який номер збірки ви хочете використовувати. Тож якщо ви оновите Xcodeосновну версію, поле збірки порожнє. Поле версії може бути порожнім !.


Щоб отримати номер збірки як NSStringзмінну:

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

Щоб отримати номер версії як NSStringзмінну:

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

Якщо ви хочете обидва в одному NSString:

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

Це перевірено за допомогою Xcode версії 4.6.3 (4H1503) . Число збірки часто записується в дужки / дужки. Номер складання - у шістнадцятковій чи десятковій.

нарощування і перетворення


У 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"

Налаштування_проекту


6

Дякую @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

Інший спосіб - встановити номер версії в 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];
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.