Разница между Version и Build в Xcode: Что такое для iOS?
Узнайте разницу между CFBundleShortVersionString и CFBundleVersion в Xcode, почему поле Version остаётся пустым после миграции и как держать их в синхронизации.
Version vs Build in Xcode
Я работал над приложением, которое изначально было создано в Xcode 3, и только сейчас начал редактировать его в Xcode 4. В сводке цели вы увидите форму целевого приложения iOS с такими полями: идентификатор (identifier), версия (version), сборка (build), устройства (devices) и целевая версия iOS (deployment target). Поле версия пустое, а поле сборка показывает 3.4.0 — то же число, которое было версией приложения, когда я работал в Xcode 3.
Мои вопросы:
- В чём разница между полями версия и сборка?
- Почему поле версия остаётся пустым после перехода на Xcode 4?
В Xcode 4 поле Version отображает значение ключа CFBundleShortVersionString, а поле Build показывает CFBundleVersion.
Если ключ CFBundleShortVersionString отсутствует или пустой в Info.plist вашего приложения, Xcode оставляет поле Version пустым – вы сразу заметите, что оно не заполняется.
Именно поэтому после обновления поле осталось пустым, хотя поле Build всё ещё показывает старый номер версии, который был сохранён в CFBundleVersion.
Содержание
- Что представляет каждый пункт
- Почему поле Version пустое в Xcode 4
- Как исправить и держать оба поля в синхронизации
- Быстрый справочный таблица
Что представляет каждый пункт
| Поле | Ключ в Info.plist | Назначение | Формат | Типичное использование |
|---|---|---|---|---|
| Version | CFBundleShortVersionString |
Публичная версия, видимая пользователю (App Store, Настройки) | Три разделённых точками целых числа (например, 1.0.3) | Увеличивается при публикации новой версии приложения |
| Build | CFBundleVersion |
Внутренний идентификатор сборки для разработчиков | Любая строка, часто монотонно возрастающий номер или метка сборки (например, 42, 1A42) | Увеличивается при каждой сборке, используется для диагностики, загрузки в App Store и CI‑счётчиков |
Документация Apple уточняет, что CFBundleShortVersionString представляет выпускную версию, тогда как CFBundleVersion представляет любую сборку, опубликованную или нет 【1】.
В Xcode 4 сводка цели теперь напрямую связывает эти ключи с полями Version и Build соответственно.
Почему поле Version пустое в Xcode 4
При миграции проекта из Xcode 3:
- Конвенция Xcode 3 – большинство проектов Xcode 3 использовали только CFBundleVersion для хранения публичной версии и оставляли CFBundleShortVersionString неустановленным.
- Изменение в Xcode 4 – Xcode 4 ожидает наличие
CFBundleShortVersionString. Если его нет, UI показывает пустое поле Version. - Результат – поле Build всё ещё отображает
3.4.0, потому что это значение хранится вCFBundleVersion. Поле Version остаётся пустым, потому чтоCFBundleShortVersionStringотсутствует.
Ответ на Stack Overflow отмечает, что после обновления до Xcode 4 «поле Version пустое», когда соответствующий ключ не задан в Info.plist 【2】.
Как исправить и держать оба поля в синхронизации
- Откройте вкладку Info целевого проекта в Xcode 4.
- Добавьте или отредактируйте поле Bundle versions string, short (это
CFBundleShortVersionString).- Если его нет, нажмите кнопку + и выберите Bundle versions string, short.
- Установите то же значение, которое вы видите в поле Build (например,
3.4.0) или желаемую публичную версию (например,3.4.0). - Увеличивайте поле Build при каждой новой сборке (например,
3.4.1,3.4.2). - Автоматизируйте: в скриптах CI обновляйте оба ключа перед архивированием. Типичный скрипт может использовать
PlistBuddyдля увеличения числовой частиCFBundleVersion, при этом оставляяCFBundleShortVersionStringнеизменным 【3】.
После этих шагов поле Version будет показывать правильную публичную версию, а поле Build будет отслеживать внутренние итерации.
Быстрый справочный таблица
| Xcode 3 | Xcode 4 |
|---|---|
Version → CFBundleVersion |
Version → CFBundleShortVersionString |
Build → CFBundleVersion |
Build → CFBundleVersion (часто совпадает с Version) |
Пустой CFBundleShortVersionString → пустое поле Version |
Отсутствующий ключ → пустое поле Version |
Заключение
- Version =
CFBundleShortVersionString(публичная, разделённая точками, три части). - Build =
CFBundleVersion(внутренняя, любая строка). - Пустое поле Version после миграции в Xcode 4 связано с тем, что
CFBundleShortVersionStringне задан. - Просто добавьте или обновите этот ключ в вкладке Info целевого проекта и держите оба значения синхронизированными для плавного рабочего процесса релиза.