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-Notifications, 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 у таргету апликације. Све Apple услуге, од Push-Notifications до 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 Portal-у који обједињује Bundle ID са скупом укључених услуга (capabilities). App ID се креира на основу Bundle ID-а и користи се за генерисање профила за потписивање.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође