Какие версии / номера сборки приложения iOS ДОЛЖНЫ быть увеличены после выпуска App Store?

107

Поля версии / сборки для приложения iOS включают:

  • «Version» CFBundleShortVersionString (String - iOS, OS X) указывает номер версии выпуска пакета, который определяет выпущенную итерацию приложения. Номер версии выпуска представляет собой строку, состоящую из трех целых чисел, разделенных точкой.

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

  • «Номер версии iTunes Connect» : номер версии, который вы указываете при создании новой версии приложения в iTunes Connect.

У меня вопрос:

Какие номера версий / сборок необходимо увеличить, когда новая версия приложения загружается в iTunes Connect и / или выпускается в App Store?

Может ли «версия» CFBundleShortVersionStringили «сборка» CFBundleVersionоставаться неизменными между обновлениями приложения?

Дополнительные баллы для источников Apple или точные сообщения об ошибках, отображаемые iTunesConnect при загрузке недопустимого номера версии / сборки.


Примечание для Android / Google Play:

Обсуждение, вызывающее этот вопрос, заключается в том, что общедоступная «версия» приложения Android в Google Play Store не требует увеличения и никоим образом не проверяется. android:versionNameМожет оставаться такой же между выпусками, обновление, понижение рейтинга, или любая случайная строка , а не то , что , как представляется допустимым «номер версии».

android:versionName - Строковое значение, представляющее версию выпуска кода приложения в том виде, в каком оно должно быть показано пользователям.

Значение представляет собой строку, так что вы можете описать версию приложения как <major>.<minor>.<point>строку или как любой другой тип абсолютного или относительного идентификатора версии.

Разница между versionName и versionNumber в Android

В то время android:versionCodeкак принудительно должно быть целым числом, увеличивающимся при выпуске.


Документация Apple

Как отмечено в недавно принятом ответе , Apple недавно опубликовала Техническую заметку, в которой подробно описывается их версия и схема номеров сборки:

Техническое примечание Apple TN2420 - Номера версий и номеров сборок

пкамб
источник
Подробный ответ со
снимком

Ответы:

115

Техническое примечание Apple TN2420, номера версий и номеров сборок

Резюме:

  • Пара ( Version, Build number) должна быть уникальной.
    • Последовательность действительна: (1.0.1, 12) -> (1.0.1, 13) -> (1.0.2, 13) -> (1.0.2, 14) ...
  • Version( CFBundleShortVersionString ) должно быть в порядке возрастания.
  • Build number( CFBundleVersion ) должны быть в порядке возрастания.

Контрольный список номера версии и номера сборки

Вот некоторые вещи, которые вы можете проверить при отправке новой сборки в App Store. Убедитесь, что вы правильно настроили номер версии и номер сборки, это поможет вам избежать автоматического отклонения вашего приложения из-за их неправильной настройки.

  1. Для каждой новой версии вашего приложения вам необходимо придумывать новый номер версии. Это число должно быть больше, чем последний использованный номер версии. Хотя вы можете предоставить множество сборок для любой конкретной версии вашего приложения, вам нужно использовать только один новый номер версии для каждой новой версии вашего приложения.
  2. Вы не можете повторно использовать номера версий.
  3. Для каждой новой сборки, которую вы отправляете, вам нужно будет изобретать новый номер сборки, значение которого больше, чем последний номер сборки, который вы использовали (для той же самой версии).
  4. Вы можете повторно использовать номера сборки в разных сериях выпусков, но вы не можете повторно использовать номера сборки в одной серии выпусков. Для приложений macOS нельзя повторно использовать номера сборок ни в одной серии выпусков.

На основании контрольного списка (Version, Build Number)действительна и следующая последовательность.

  • Случай: повторное использование Build Numberв разных цепях выпуска. (ПРИМЕЧАНИЕ: НЕ приложение для macOS)

    (1.0.0, 1) -> (1.0.0, 2) -> ... -> (1.0.0, 11) -> ( 1.0.1 , 1 ) -> (1.0.1, 2)

AechoLiu
источник
Я запутался. Одно из условий - «Вы не можете повторно использовать номера версий», но в последнем примере номера версий остаются прежними, а номера сборки увеличиваются. Я что-то неверно истолковываю?
Эмиль
@Emil, я думаю, что эту пару (Версия, Номер сборки) повторно использовать нельзя.
AechoLiu
6
@EmilParikh Номера версий могут быть загружены в Apple несколько раз до выпуска , каждый из которых имеет уникальный номер сборки. Но как только он будет выпущен, вы не сможете повторно использовать этот номер версии.
pkamb
1
TN2420 сообщает: «Номера версий и номера сборки могут содержать до трех компонентов, разделенных точками », а затем предоставляет следующий недопустимый пример 1.10000.1.5 . Однако похоже, что многие приложения, включая Chrome, используют номер версии, содержащий 4 компонента (например, 68.0.3440.83 ). Я предполагаю, что это можно объяснить тем фактом, что на странице TN2420 упоминается « Важно: этот документ больше не обновляется». Однако мне не удалось найти обновленный документ, определяющий новые правила. Кто-нибудь еще запутался?
catanman
@catanman Мне нравится эта семантическая версия . Пусть версия будет составлена ​​в (major, minor, patch)манере. Раньше я использовал 4 компонента, но магазин приложений не принимает этот формат с 4 компонентами.
AechoLiu
38

Он CFBundleShortVersionStringдолжен соответствовать номеру версии, который вы предоставляете iTunes Connect. Это также номер версии, который отображается, когда пользователь просматривает ваше приложение в App Store.

Номер версии отображается в магазине, и эта версия должна совпадать с номером версии, который вы вводите позже в iTunes Connect.

Источник

CFBundleVersionНе отображается в App Store, но используется в ITunes , чтобы определить , когда ваше приложение было обновлено.

Если вы обновите строку сборки, как описано в разделе «Установка номера версии и строки сборки», iTunes распознает, что строка сборки изменилась, и правильно синхронизирует новый пакет iOS App Store с тестовыми устройствами.

Источник

Отвечая на ваши вопросы более конкретно ...

Какие номера версий / сборок необходимо увеличивать при загрузке новой версии приложения в магазин приложений?

Обе. Один отображается в App Store, другой используется iTunes для обновления приложения.

Может ли CFBundleShortVersionString или CFBundleVersion оставаться неизменными между обновлениями приложений?

Нет (мета-вопрос, какой здесь вариант использования? Если вы каким-либо образом отредактировали полезную нагрузку, сборка будет другой, и пользователь захочет узнать об этом). Если вы попытаетесь, вы увидите сообщения об ошибках, как показано ниже:

Сообщения об ошибках

Или они сравниваются с предыдущим соответствующим номером, чтобы гарантировать, что в новой версии приложения будет загружено большее числовое значение?

Да. Использование стандарта semver.org .

Сравниваются ли числа CFBundleShortVersionString и CFBundleVersion как-либо друг с другом?

Нет.

Энди
источник
2
Хорошо, я знаю, как используются эти два числа. Возникает вопрос: нужно ли увеличивать их оба при выпуске новой версии приложения?
pkamb
2
Да, если вы попытаетесь отправить приложение в App Store, не обновляя оба, вы увидите сообщение об ошибке, например, stackoverflow.com/questions/19367893/…
Энди,
Спасибо, отличное редактирование. Специально по этой ссылке. Валидатор организатора показывает ошибки «должен содержать более позднюю версию» как для CFBundleVersion, так и для CFBundleShortVersionString.
pkamb
1
+1 для ссылки SemVer ... Учитывая номер версии MAJOR.MINOR.PATCH, увеличивайте версию: MAJOR, когда вы вносите несовместимые изменения API, MINOR версию, когда вы добавляете функциональные возможности обратно совместимым образом, и версию PATCH, когда вы делаете наоборот -совместимые исправления ошибок.
jeet.chanchawat 07
Относительно этого: какой вариант использования здесь? Если вы каким-либо образом отредактировали полезную нагрузку, сборка будет другой, и пользователь захочет узнать об этом . Мой пример использования: мое приложение было успешно рассмотрено Apple, но никогда раньше не выпускалось в App Store. Я обнаружил ошибку и хочу исправить ее - без изменений CFBundleShortVersionString. Это возможно? Я хочу отклонить собственное приложение.
тестирование
31

CFBundleShortVersionString - это публичное «имя» версии (пример: «2.5» или «3.8.1»). Вы должны увеличивать его с каждым выпуском .

CFBundleVersion - это частный номер сборки . Его не видно в AppStore. Вы должны увеличивать его при каждой загрузке . Это означает, что если вы когда-нибудь отклоните двоичный файл до того, как он перейдет в оперативный режим, и вы захотите загрузить новый двоичный файл, он будет иметь тот же CFBundleShortVersionString, но должен иметь более высокий CFBundleVersion (пример: общедоступный «2,5», частный «2,5», а затем двоичный код отклонить и повторно загрузить частный "2.5.1")

Редактировать 16 ноября 2016 г .:

/ ! \ Свойство CFBundleVersion также используется (вместе с CFBundleName ) в User-Agentзаголовке, отправляемом NSURLConnection в вашем коде.

Пример: если CFBundleName - MyApp, а CFBundleVersion - 2.21, то любой программный HTTP-запрос, отправленный непосредственно вашим кодом с использованием NSURLConnection, будет включать заголовок:

User-Agent: MyApp/2.21 CFNetwork/... Darwin/...

(Это не относится к запросам, автоматически отправляемым UIWebView).

Габриэль
источник
2
Большое различие между требованиями для загрузки / выпуска.
pkamb
@gabriel, я пытался установить номер сборки на XX-rc2, но валидатор Organizer не позволяет мне устанавливать что-либо отличное от XYZ, где X, Y и Z являются целыми числами: S. Было бы здорово иметь номер сборки -rc2, вы когда-нибудь могли отправить с ним один выпуск?
Néstor
1
@nestor Ты прав, я ошибался. Разрешены только числа. Разрешите отредактировать свой ответ.
Габриэль
@gabriel, я использую скрипт для синтаксического анализа X.X-rc2для X.X.2для системы CI , чтобы сгенерировать buildNumberдля загрузки в iTunesConnect.
AechoLiu
5

CFBundleVersion и CFBundleShortVersionString должны быть больше, чем номер последней версии приложения. Хорошая практика - оставить их такими же. Вы должны найти их в вашем -info.plist.

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

xoail
источник
Я упомянул оба этих ключа в своем вопросе. Ваш ответ здесь, что оба этих значения должны быть увеличены? Не могли бы вы лучше поддержать свой ответ?
pkamb
Да, оба должны быть увеличены. Вчера вечером, когда я пытался отправить их до увеличения, он пожаловался на оба ключа.
xoail
Спасибо за дополнительную информацию. Вы должны отредактировать свой ответ, чтобы добавить свой опыт при загрузке сборки.
pkamb
6
«Хорошая практика - оставлять их такими же» - это не обязательно так. Если над вашим приложением работают тестировщики, вы можете увеличить номер сборки по мере применения изменений, но оставьте номер версии прежним. Используя непрерывную интеграцию, вы можете, например, обновить номер сборки перед развертыванием для тестировщиков.
Энди
@ Энди, ты прав, это имеет смысл. Спасибо, что указали на вариант использования. Я думал только о единой среде разработчика / тестировщика.
xoail
5

Оба CFBundleVersionи CFBundleShortVersionString ДОЛЖНЫ быть увеличены при выпуске новой версии в App Store.

Кроме того, одна из строк должна соответствовать версии, указанной в iTunes Connect.

Ошибка Xcode Organizer Validator: необходимо увеличить номер версии.

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

  • Этот пакет недействителен. Значение ключа CFBundleVersion[1.0] в файле Info.plist должно содержать более позднюю версию, чем версия ранее загруженной версии [1.134].

  • Этот пакет недействителен. Значение ключа CFBundleShortVersionString[1.0] в файле Info.plist должно содержать более позднюю версию, чем версия ранее загруженной версии [1.134].

Валидатор также выдает ошибку, доказывая, что одна из строк должна соответствовать версии приложения, созданного в iTunes Connect.

  • Несоответствие версий. Ни CFBundleVersion ['1.0'], ни CFBundleShortVersionString ['1.0'] в Info.plist не соответствуют версии приложения, установленной в iTunes Connect ['1.4'].
пкамб
источник
2

В текущем техническом примечании Apple TN2420, «Номера версий» и «Номера сборки» говорится (выделено жирным шрифтом):

  1. Для приложений iOS вы можете повторно использовать номера сборок в разных сериях выпусков, но вы не можете повторно использовать номера сборок в одной серии выпусков. Для приложений macOS нельзя повторно использовать номера сборок ни в одной серии выпусков .

К сожалению, это означает, что вы не можете повторно использовать номер сборки, который соответствует номеру последовательности выпуска на iOS, когда вы пытаетесь выпустить ту же сборку на Mac Catalyst.

В моем случае, например, из-за некоторых более ранних проблем я закончил выпуск 1.0.2 (4) как приложение Mac Catalyst, которое соответствовало 1.0.2 (1) на iOS. Теперь при попытке выпустить 1.0.3 (1) на обоих приложениях приложение не проходит проверку в MacOS из-за номера сборки, тогда как оно проходит проверку на iOS.

Я предполагаю, что теперь, когда я регулярно выпускаю одно и то же приложение для iOS и MacOS, я буду использовать номера сборки, соответствующие дате, например, 20200111, и увеличивать с десятичной точкой, если мне нужно изменить номер сборки в данном выпуске.

Стив Харрис
источник
1

Вам нужно увеличить оба .

При загрузке новой версии вам нужно будет создать новую версию в iTunes Connect, которая автоматически будет выше, чем предыдущие версии. Эта версия в iTunes Connect будет ожидать двоичный файл с тем же номером версии, поэтому ее CFBundleShortVersionStringнеобходимо увеличить.

Если вы обновите версию, но забудете CFBundleVersionувеличить, вы столкнетесь с ошибкой во время загрузки. См. Ответ и скриншот pkamb.

Подробнее о CFBundleShortVersionStringи CFBundleVersionсм. На странице https://stackoverflow.com/a/31921249/936957.

Юнус Недим Мехел
источник
1

Я могу подтвердить, просто попробовав оба способа, что последовательность номеров версий и сборок вроде ...

1.0.0 (1)
1.0.1 (1)
1.0.2 (1)

... будет приниматься для приложений iOS, но для приложений Mac (Catalyst) он возвращает эту ошибку:

ОШИБКА ITMS-90061: «Этот пакет недействителен. Значение ключа CFBundleVersion [1] в файле Info.plist должно содержать более позднюю версию, чем версия ранее загруженной версии [2]».

Номер версии и сборки для Mac должен выглядеть как ...

1.0.0 (1)
1.0.1 (2)
1.0.2 (3)

Для iOS я использовал номера сборки как номер версии плюс четвертую цифру, например ...

1.0.0 (1.0.0.1)
1.0.1 (1.0.1.1)
1.0.2 (1.0.2.1)

... но это также не разрешено для приложений Mac. Когда я пытался отправить свое первое приложение для Mac (Catalyst), Apple принимала только номер сборки, состоящий из трех или менее цифр:

ОШИБКА ITMS-9000: «Этот пакет недействителен. Значение ключа CFBundleVersion [1.0.0.1] в файле Info.plist должно быть списком, разделенным точками, не более чем из трех неотрицательных целых чисел».

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

Arlomedia
источник
Есть ли у вас какие-либо сообщения об ошибках, которые он вам выдал? Пожалуйста, процитируйте их, если так!
пкамб
0

Я готовлюсь к выпуску нового приложения Mac App Store. Использование форматирования CalVer файловYEAR.release (build) .

Я загрузил несколько сборок: 2020.0 (1), 2020.0 (2)и т.д. Я , наконец , представлен 2020.0 (8)на App Store Review. Он прошел проверку и находится в состоянии ожидающего выпуска разработчика .

Я хотел , чтобы исправить несколько вещей , перед выпуском, так что я добавил новую сборку в том же поезде релиз: 2020.0 (9).

Это приводит к ошибке:

Ошибка операции App Store Connect

ОШИБКА ITMS-90062 : «Этот пакет недействителен. Значение ключа CFBundleShortVersionString[2020.0] в файле Info.plist должно содержать более позднюю версию, чем версия ранее утвержденной версии [2020.0]. Дополнительную информацию можно найти CFBundleShortVersionStringна https: // developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring "

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

Решение, похоже, состоит в том, что «поезд выпуска» (та же версия + новая сборка) не может быть обновлен, если состояние приложения - « Ожидающий выпуск разработчика» . Либо выпустите существующую сборку, а затем увеличьте версию, либо отмените этот выпуск в App Store Connect, чтобы разрешить дальнейшие загрузки для этого набора выпусков.

пкамб
источник
-2

AFAIK, из моей головы, вам нужно только увеличить номер сборки CFBundleVersion. Увеличение строки короткой версии необязательно, хотя вам, вероятно, следует увеличить ее, поскольку она сообщает пользователю, что приложение новое. Apple утверждает, что нумерация должна соответствовать традиционным соглашениям об управлении версиями программного обеспечения, и iTunes Connect может пожаловаться, если вы попытаетесь повторно загрузить уже существующую версию.

Короче говоря, это может сработать, но, вероятно, нет.

SevenBits
источник
Ищу авторитетные ответы о том, какие ключи нужно увеличивать. Если CFBundleShortVersionStringприращение не требуется, «одну и ту же» пользовательскую версию можно будет загрузить в App Store несколько раз?
pkamb