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 препоръчва използване на обратен запис на името на домейна, за да се гарантира глобална уникалност. Ако компанията няма домейн, се позволява използване на имейл: 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("Текущ 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 в target-а на приложението. Всички услуги на 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. Това е удобно за паралелно инсталиране на версията за разработка до продукционната версия на едно и също устройство за тестване.
Ако приложението има разширения (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.имеакомпанията.имеаприложението. Избягвайте тирета и специални знаци. Ако приложението има разширения, добавете наставки чрез точка. Уверете се, че идентификаторът е уникален и не е зает от друг разработчик.
Да, всяко разширение — уиджет, 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, който комбинира Bundle ID с набор от включени услуги (capabilities). App ID се създава на базата на Bundle ID и се използва за генериране на профили за подписване.
Заключение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също