App Bundle ID — это уникальный идентификатор приложения, используемый в экосистемах Apple и Google для регистрации, подписи и распространения программного продукта. Каждое приложение получает свой Bundle ID при создании проекта, и этот идентификатор остаётся неизменным на всём жизненном цикле. По данным Apple Developer Documentation, Bundle ID используется для привязки сервисов, сертификатов и профилей подписи.
Главное
Bundle Identifier — это строка, которая однозначно идентифицирует приложение в операционной системе и магазине приложений. В iOS и macOS он называется Bundle ID, в Android — Package Name, хотя функционально оба выполняют одну роль: обеспечивают уникальность приложения на устройстве и в сторе.
Операционная система использует Bundle ID для разграничения приложений на устройстве. Два приложения с одинаковым идентификатором не могут быть установлены одновременно — система воспринимает их как один и тот же продукт. Магазины приложений также проверяют уникальность Bundle ID при публикации.
Apple ввела Bundle ID с выходом iOS SDK в 2008 году. Формат reverse domain notation был заимствован из Java (package naming convention), где он используется для предотвращения конфликтов имён классов. Google перенял эту практику для Android, что обеспечило единообразие в обеих мобильных экосистемах.
| Платформа | Название поля | Пример |
|---|---|---|
| iOS/macOS | Bundle Identifier | com.example.myapp |
| Android | Package Name | com.example.myapp |
| watchOS | Bundle Identifier | com.example.myapp.watchkit |
| tvOS | Bundle Identifier | com.example.myapp.tvos |
Bundle ID состоит из нескольких сегментов, разделённых точками. Первая часть — идентификатор разработчика или компании (com, org, net). Вторая — домен компании (example, google, apple). Последующие сегменты уточняют название приложения и платформы.
Типичный Bundle ID выглядит как com.company.appname. Apple рекомендует использовать обратную запись доменного имени, чтобы гарантировать глобальную уникальность. Если у компании нет домена, допускается использование email: com.example.myapp или org.example.myapp.
Apple поддерживает Wildcard Bundle ID — шаблон идентификатора со звёздочкой: com.example.*. Такой шаблон позволяет использовать один App ID для нескольких приложений одной компании. Wildcard ID удобен на этапе разработки, но не рекомендуется для продакшна, так как ограничивает использование некоторых сервисов Apple.
Ограничения wildcard: Push-уведомления, CloudKit, In-App Purchase и Game Center требуют точного (explicit) Bundle ID. При использовании шаблона com.example.* эти сервисы недоступны. Для продакшн-приложений всегда используйте explicit Bundle ID, чтобы обеспечить полную функциональность всех сервисов Apple.
Помимо wildcard, Apple поддерживает префиксные идентификаторы, которые назначаются команде разработчиков при регистрации в Apple Developer Program. Префикс (Team ID) автоматически добавляется ко всем App ID и профилям подписи. Два разных Team ID могут создать одинаковый Bundle ID, но на устройстве они считаются разными приложениями.
Регистрация Bundle ID — обязательный этап перед публикацией приложения. В экосистеме Apple регистрация выполняется в Apple Developer Portal через раздел Certificates, Identifiers & Profiles. В Google Play Bundle ID указывается при создании приложения в консоли разработчика.
На портале Apple Developer выберите раздел Identifiers, нажмите кнопку Register и укажите тип App ID. Введите точное название Bundle ID и выберите необходимые capabilities: Push Notifications, CloudKit, Sign in with Apple. После регистрации идентификатор становится доступным для создания профилей подписи.
// Проверка Bundle ID в коде приложения
let bundleID = Bundle.main.bundleIdentifier
print("Current Bundle ID: \(bundleID ?? "unknown")")
// Проверка Bundle ID для условий сборки
if bundleID == "com.example.app.production" {
// Продакшн-конфигурация
Analytics.shared.configure(.production)
}
Google Play Console не требует предварительной регистрации Bundle ID. Идентификатор указывается в файле build.gradle модуля приложения и должен быть уникальным в рамках всего Google Play. После создания приложения изменить Package Name невозможно, поэтому выбирайте идентификатор тщательно и проверьте его уникальность через поиск в Google Play. Google не освобождает идентификаторы удалённых приложений, поэтому занятый однажды Bundle ID остаётся недоступным для других разработчиков.
При регистрации в App Store Connect необходимо указать Bundle ID из существующего набора зарегистрированных идентификаторов. Если идентификатор ещё не зарегистрирован на портале Apple Developer, система предложит создать его автоматически. После регистрации Bundle ID привязывается к команде и не может быть перенесён на другой аккаунт разработчика без обращения в поддержку Apple. Каждый Bundle ID может иметь несколько профилей подписи для разных окружений: Development, Ad Hoc, App Store.
При регистрации Bundle ID для iOS приложения с расширениями потребуется зарегистрировать каждый компонент отдельно. Расширения виджетов, клавиатуры, Notification Service и Watch App имеют собственные идентификаторы, производные от основного. App Store Connect объединяет их в группу при создании App Record, что позволяет публиковать все компоненты как одно приложение.
Настройка Bundle ID в Xcode выполняется в нескольких местах: Info.plist, Build Settings и Signing & Capabilities. Центральное поле — Bundle Identifier в таргете приложения. Все сервисы Apple, от Push-уведомлений до CloudKit, привязываются к этому идентификатору. Неправильно указанный Bundle ID приводит к ошибкам подписи и невозможности публикации в App Store.
<!-- Info.plist — базовый Bundle ID проекта -->
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<!-- Build Settings — переменная PRODUCT_BUNDLE_IDENTIFIER -->
<!-- Debug: com.example.app.dev -->
<!-- Release: com.example.app -->
Xcode использует переменную PRODUCT_BUNDLE_IDENTIFIER в Build Settings. Для разных конфигураций сборки можно задать разные значения: com.example.app.dev для Debug и com.example.app для Release. Это удобно для параллельной установки dev-версии рядом с продакшном на одном устройстве для тестирования.
Если приложение имеет расширения (Notification Service, Widget, Watch App), каждое расширение получает собственный Bundle ID с суффиксом. Основное приложение: com.example.app. Расширение для виджета: com.example.app.widget. Watch App: com.example.app.watchkit. Каждый идентификатор регистрируется отдельно в Apple Developer Portal и получает отдельный профиль подписи. Xcode автоматически управляет этими зависимостями при сборке.
App Bundle ID (Apple) и Package Name (Google) — это аналогичные сущности с одинаковым назначением, но разными правилами использования в экосистемах iOS и Android. Оба идентификатора используют reverse domain notation и не могут быть изменены после публикации в официальных магазинах приложений.
В экосистеме Apple Bundle ID связан с профилем подписи и сертификатами. При смене команды разработчика Bundle ID можно перенести между аккаунтами через App Store Connect. В Android Package Name жёстко привязан к приложению в Google Play и не может быть перенесён между аккаунтами разработчика.
| Характеристика | iOS Bundle ID | Android Package Name |
|---|---|---|
| Максимальная длина | Не ограничена | 150 символов |
| Разделитель сегментов | Точка (.) | Точка (.) |
| Допустимые символы | A-Z, a-z, 0-9, точка, дефис | A-Z, a-z, 0-9, точка, подчёркивание |
| Wildcard | Поддерживается (*) | Не поддерживается |
| Использование в коде | Bundle.main.bundleIdentifier | BuildConfig.APPLICATION_ID |
Несмотря на различия, оба идентификатора выполняют критическую роль: без них невозможно опубликовать приложение в официальном магазине. Рекомендация для кросс-платформенных проектов — использовать одинаковый идентификатор в iOS и Android версиях, чтобы упростить интеграцию с Firebase, Analytics и другими сервисами. Это также упрощает навигацию для команды разработки: один идентификатор для обоих проектов снижает путаницу при настройке CI/CD и конфигурации окружений.
При разработке с использованием Flutter или React Native единый идентификатор особенно важен, так как кодовая база общая, и многие инструменты автоматической сборки ожидают одинаковое имя пакета для обеих платформ. Firebase-проект также привязывается к одному идентификатору для iOS и Android, что упрощает настройку аналитики и краш-репортинга.
Часто задаваемые вопросы
Изменить Bundle ID после публикации в App Store или Google Play невозможно. Система воспримет новый идентификатор как совершенно другое приложение. Для обновления существующего продукта Bundle ID должен оставаться неизменным на всём жизненном цикле приложения.
Устройство iOS или Android не позволит установить второе приложение с тем же идентификатором поверх первого. Система выдаст ошибку и предложит удалить существующее приложение. В сторах публикация с дублирующимся Bundle ID также заблокируется.
Используйте reverse domain notation вашей компании: com.companyname.appname. Избегайте дефисов и специальных символов. Если приложение имеет расширения, добавьте суффиксы через точку. Убедитесь, что идентификатор уникален и не занят другим разработчиком.
Да, каждое расширение — виджет, Watch App, Notification Service — требует собственного Bundle ID. Идентификаторы образуют иерархию: com.example.app как базовый, com.example.app.widget для виджета, com.example.app.watchkit для Watch. Все они регистрируются отдельно в Apple Developer Portal и используют общий App ID с родительским приложением.
Bundle ID — это строка-идентификатор в коде приложения. App ID — это объект в Apple Developer Portal, который объединяет Bundle ID с набором включённых сервисов (capabilities). App ID создаётся на основе Bundle ID и используется для генерации профилей подписи.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также