Какие значения следует использовать для CFBundleVersion и CFBundleShortVersionString?

Это мое первое приложение для приложения iOS, и я не хочу отклонять мое приложение.

Это из документов Apple:

CFBundleVersion (String - iOS, OS X) указывает номер версии сборки пакета, который идентифицирует итерацию (выпущенную или не выпущенную) пакета. Номер версии сборки должен быть строкой, состоящей из трех неотрицательных целых чисел, разделенных периодом, причем первое целое число больше нуля. Строка должна содержать только числовые символы (0-9) и период (.). Ведущие нули усекаются из каждого целого числа и будут игнорироваться (то есть 1.02.3 эквивалентно 1.2.3). Этот ключ не локализуется.

CFBundleShortVersionString (String - iOS, OS X) указывает номер версии выпуска пакета, который идентифицирует выпущенную итерацию приложения. Номер версии выпуска - это строка, состоящая из трех целых чисел, разделенных периодом. Первое целое число представляет собой серьезные изменения в приложении, такие как версии, которые реализуют новые функции или основные изменения. Второе целое обозначает версии, которые реализуют менее заметные функции. Третье целое число представляет версии обслуживания.

Значение для этого ключа отличается от значения для "CFBundleVersion", которое идентифицирует итерацию (выпущенную или невыпущенную) приложения. Этот ключ можно локализовать, включив его в ваши файлы InfoPlist.strings.

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

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

Может кто-нибудь подтвердить 100%, что я должен поставить?

Ответ 1

Подумайте об этом так: "короткая версия" (CFBundleShortVersionString) - это общедоступный номер версии. "Версия" (CFBundleVersion) больше относится к внутреннему номеру версии, который может меняться намного чаще, чем публичная "короткая версия". Лично я использую то же самое для обоих, но многие люди обновляют "версию" для каждой сборки. В любом случае вы обычно обновляете "короткую версию" при выпуске в Apple. Как часто вы обновляете "версию", зависит от вас и ваших потребностей.

Ответ 2

CFBundleShortVersionString предоставляет вам версию вашего приложения. Обычно он увеличивается каждый раз, когда вы публикуете свое приложение в App Store. Это версия, которая отображается в разделе "Версия" на странице App Store вашего приложения.

CFBundleVersion дает вам номер сборки, который используется для разработки и тестирования, а именно "технических" целей. Конечный пользователь редко интересуется номером сборки, но во время разработки вам может понадобиться узнать, что разрабатывается и исправляется в каждой сборке. Это обычно увеличивается на каждой итерации внутреннего выпуска. И вы можете использовать инструменты непрерывной интеграции, такие как Jenkins, чтобы автоматически увеличивать номер сборки для каждой сборки.

Version and Build numbers

Эти два числа не зависят друг от друга, но это хорошая идея, чтобы держать их параллельно, чтобы избежать путаницы. Имейте в виду, что после того, как ваше приложение прошло проверку App Store, вам нужно увеличивать номер сборки, как заявили Фил и LikeTheSky, независимо от того, публикуете ли вы его или нет.

Вариант использования: допустим, у вас есть хорошо протестированная сборка, готовая к отправке. Это номер версии 1.0.0 и номер сборки 1.0.0.32. После того, как вы отправите свое приложение, вам нужно обновить версию до 1.0.1 и номер сборки как 1.0.1.0.

Ответ 3

Ответ rmaddy верен. Я добавлю еще две мысли.

Третий номер версии

Обратите внимание на номер третьей версии, указанный на веб-сайте iTunesConnect, как часть вашего определения приложения. Если это число отличается от двух в Xcode, Apple дает вам предупреждение. Вы можете игнорировать предупреждение, так как это не шоу-стоппер (а не "ошибка" ).

Дата-время как версия

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

Для других приложений вы можете использовать просто значение даты в ISO 8601 стиль стандартного формата (YYYYMMDDHHMM). Например, 201606070620. Этот порядок года-месяца-даты-часа-минуты делает постоянно увеличивающееся число, всегда такой же длины из-за заполнения нуля, что при сортировке по алфавиту также хронологически.

Я успешно использовал этот стиль номеров версий в приложении для доставки iOS, работающем в iOS 7, 8 и 9.

Вы даже можете автоматизировать генерацию этого значения. В ваших проектах Target > Build Phases > Run Script панель:

  • Укажите в поле Shell: /bin/sh
  • Вставьте следующие 5 строк script, показанные ниже.
  • (необязательно) Установите флажок Show environment variables in build log.
  • Снимите флажок Run script only when installing.

Каждый раз, когда вы создаете текущую дату-время в UTC, фиксируется часовой пояс. Флаг -u в script использует UTC, а не текущий часовой пояс по умолчанию. Как правило, лучше всего использовать программисты и системные администраторы в UTC, а не в локальных часовых поясах.

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

Или используйте гибрид с обычным 1.2.3 для номера версии и даты-времени в качестве номера сборки. Чтобы сделать гибрид, просто закомментируйте строку CFBundleShortVersionString с # спереди.

Ответ 4

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

Документы Apple говорят, что CFBundleVersion "должна быть строкой, состоящей из 3 неотрицательных целых чисел, разделенных периодами". На самом деле это может быть БОЛЕЕ ЧЕМ 3 части (в качестве выше ответа). Я использую это, чтобы указать мою сборку разработки, скажем, мой CFBundleShortVersionString 1.0.0, я могу использовать 1.0.0.11 для CFBundleVersion, чтобы указать, что это моя 11-я версия для выпуска 1.0.0

Каждая CFBundleVersion, представленная в хранилище приложений, должна быть больше, чем раньше, или вы получите ERROR ITMS-90478: "Неверная версия. Невозможно импортировать сборку с версией" xxx ", поскольку более поздняя версия были закрыты для новых представлений о сборке. Выберите другой номер версии."

CFBundleShortVersionString может иметь только 3 части или вы получите ERROR ITMS-90060: значение для ключа CFBundleShortVersionString 'xxx' в файле Info.plist должно быть разделенным периодом списком не более трех неотрицательных целых чисел.

3-е число, о котором упоминал Василий Бурк, т.е. номер версии на iTunesConnect, где ситуация может осложниться.

Я использую другой номер iTunesConnect, чем CFBundleShortVersionString, потому что, когда я впервые отправил свое приложение в магазин приложений, у нас уже есть много раундов внутренних выпусков. Поэтому я использовал 1.0 для номера iTunesConnect и 5.x для CFBundleShortVersionString. В следующем выпуске в магазине приложений я предоставил функцию, чтобы проверить, есть ли в магазине приложений более новая версия, и понял, что у меня были проблемы сейчас, потому что я могу получить только номер iTunesConnect (используя http://itunes.apple.com/lookup?bundleId=), поэтому мне нужно сделать некоторые вычисления для прежде чем сравнивать его с номером CFBundleShortVersionString.

Я попытался исправить это, используя номер iTunesConnect в качестве моей CFBundleShortVersionString, но получил ошибку, ERROR ITMS-90062: "Этот пакет недействителен. Значение для ключа CFBundleShortVersionString [xxx] в Info.plist должен содержать более высокую версию, чем версия, ранее одобренная [xxx]."

Поэтому я предлагаю всегда сделать их одинаковыми.

Ответ 5

Наиболее разумной для меня схемой является использование номера версии (т.е. CFBundleShortVersionString) для фактического номера версии, а затем используйте номер сборки (т.е. CFBundleVersion) для представления представления в App Store. Поэтому, если нет никаких проблем и, следовательно, повторно отправляется, это число всегда 1. Для новой версии я reset до 1, если предыдущие проблемы были в TestFlight или в обзоре.

Номера сборки предоставляют способ назвать каждое из представленных вами материалов для определенной версии. Как описано в приведенных выше определениях, сбор всех сборок, которые вы предоставляете для определенной версии вашего приложения, называется той версией "выпускной поезд". Для приложений iOS номера сборки должны быть уникальными в каждом выпуске, , но они не обязательно должны быть уникальными в разных моделях рассылки [мой акцент]. То есть, для iOS Apps вы можете использовать те же номера сборки снова в разных выпусках, если хотите.

От Техническая нота TN2420: Номера версий и номера сборки.

Ответ 6

Что-то, что я никогда не видел нигде, это то, что является максимальным числом для каждого поля в CFBundleVersion?

Установив CFBundleVersion в приложении 1.1.1 и взглянув на шестнадцатеричную vaue для версии в "lsregister -dump", я определил, что максимальное значение для первого поля равно (2 ^ 22) -1 или 4194303, и максимальные значения для второго и третьего полей равны (2 ^ 21) -1 или 2097151.

3 поля содержат до 64 бит.

Это имеет значение для тех из нас, кто использует CFBundleVersion на основе даты и времени.

Я установил первое поле в YYYYMMDD. Это всегда больше, чем максимальные допустимые версии, и это приводило к непредсказуемым результатам, если не сказать, когда Launch Services решала, какую версию приложения запускать, когда вы устанавливали несколько версий, и использовали что-то вроде "open -a Appname" 'из командной строки.

Пожалуйста, распространите это широко. Я уверен, что многие люди расстаются с этим.

Ответ 7

На данный момент документация Apple для CFBundleVersion гласит [выделено мое]:

Версия сборки, которая идентифицирует итерацию пакета.

...

Этот ключ является машиночитаемой строкой, состоящей из одного-трех целых чисел, разделенных точкой, например 10.14.1. Строка может содержать только числовые символы (0-9) и точки.

...

Вы можете включить больше целых чисел, но система их игнорирует.

Для CFBundleShortVersionString [выделение мое]:

Выпуск или номер версии пакета.

...

Этот ключ является видимой пользователем строкой для версии пакета. Требуемый формат - три целых числа, разделенных точкой, например, 10.14.1. Строка может содержать только числовые символы (0-9) и точки.

Я бы предложил просто автоматически увеличивать CFBundleVersion для каждой сборки (или каждого выпуска в TestFlight) и сбрасывать его в 0 при каждом изменении CFBundleShortVersionString.

Вам следует явно спланировать или разработать согласованные средства для обновления видимой для пользователя версии в CFBundleShortVersionString.