App Bundle ID — це унікальний ідентифікатор застосунку, що використовується в екосистемах Apple і Google для реєстрації, підпису та розповсюдження програмного продукту. Кожен застосунок отримує свій Bundle ID під час створення проекту, і цей ідентифікатор залишається незмінним протягом усього життєвого циклу. Згідно з Документацією розробника Apple, 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також