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

100

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

Это из Apple Docs:

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% то, что я должен поставить?

BBX
источник
1
В соответствии с этим CFBundleShortVersionString может быть локализован. Но если это должно быть три целых числа, разделенных точками, какая локализация возможна?
Рик
@Rick Полагаю, это означает, что вы можете преобразовать его для языков с разными цифрами, например для арабского?
shiser 06
@shiser Просто чтобы быть педантичным, "арабские цифры" на самом деле являются числами, которые мы используем в западном мире, а также в большинстве других мест. Но я понимаю, что вы имеете в виду, и в некоторых частях арабского мира не используются "арабские цифры". en.wikipedia.org/wiki/Arabic_numerals
RenniePet,
1
Другой ответ здесь. stackoverflow.com/q/21125159/419348
AechoLiu

Ответы:

79

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

мэдди
источник
14
Имейте в виду, что версия пакета (CFBundleVersion) должна численно превышать версию пакета вашего предыдущего приложения, иначе при отправке в App Store появится ошибка. См. Stackoverflow.com/questions/4933093/… .
Фил
3
Подобно тому, что сказал выше Фил, в настоящее время, если вы повторно отправляете неудачную (не одобренную App Store) сборку, похоже, что вам нужно поднять CFBundleVersion при каждой отправке сейчас , поэтому, вероятно, эти цифры будут расходиться, если вы не всегда идеальны, или вы не возражаете против изменения номера вашей общедоступной (CFBundleShortVersionString) версии # при любых изменениях, необходимых для успешной отправки в App Store.
likethesky
108

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

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

Номера версий и сборок

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

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

Юнус Недим Мехел
источник
4
Итак, безопасно ли игнорировать этот бит в документации (цитируемой в вопросе) о том, что CFBundleVersion является « тремя » значениями, разделенными точками ?
big_m
Думаю, решать тебе. Если вы не публикуете выпуск часто или если вам не нужно строго следить за исправлением ошибок посредством частых циклов тестирования; вы также можете использовать для них 3 цифры.
Юнус Недим Мехел
так может ли CFBundleVersion быть 0 для сборки магазина приложений? Apple отклонит это?
kraftydevil
3
Да, вы можете использовать значения, отличные от трех цифр с пунктуацией. Я использовал значение даты и времени, например, 201606070620в приложении для iOS.
Basil Bourque
3
@BasilBourque, если вы не будете следовать инструкциям, у вас могут возникнуть проблемы, если вы используете покупки в приложении. См. Техническую ноту 2413
DanSkeel
16

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

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

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

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

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

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

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

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

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

Каждый раз, когда вы выполняете сборку, фиксируется текущая дата и время в часовом поясе UTC . -uФлаг в сценарии использует 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строку, поставив #перед ней.

Василий Бурк
источник
9

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

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

Из Технического примечания TN2420: Номера версий и номера сборки .

Plindberg
источник
1
Приятно видеть ответ, в котором содержится официальная ссылка, подтверждающая интерпретации, представленные в других ответах на этой странице.
user2067021
6

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

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

Каждая версия CFBundleVersion, отправленная в магазин приложений, должна быть больше, чем раньше, иначе вы получите ОШИБКУ ITMS-90478 : «Недопустимая версия. Сборка с версией« xxx »не может быть импортирована, поскольку более поздняя версия была закрыта для отправки новых сборок . Выберите другой номер версии ".

CFBundleShortVersionString может состоять только из 3 частей, иначе вы получите ОШИБКУ ITMS-90060: значение ключа CFBundleShortVersionString 'xxx' в файле Info.plist должно быть разделенным точками списком, состоящим не более чем из трех неотрицательных целых чисел ".

Третий номер , что Василий Бурк упоминается, то есть число показывает версию на 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] ".

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

Qiulang
источник
5

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

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

Сумма трех полей составляет 64 бита.

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

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

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

Дэйв Эванс
источник
Вы помните, что происходит, если добавляется четвертое поле (1.1.1.20191201) и что вы в конечном итоге используете вместо него? Я действительно хочу, чтобы Apple использовала то же числовое значение, что и здесь Android. PS спасибо, что посмотрели это!
spacesuitdiver
Я считаю, что ограничение задокументировано здесь и является немного более строгим, чем упомянутое здесь.
saagarjha
3

На данный момент в документации AppleCFBundleVersion указано [выделено мной]:

Версия сборки, определяющая итерацию пакета.

...

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

...

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

Для CFBundleShortVersionString[курсив мой]:

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

...

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

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

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

Кенни Эвитт
источник