App Bundle ID — to unikalny identyfikator aplikacji używany w ekosystemach Apple i Google do rejestracji, podpisywania i dystrybucji produktu programowego. Każda aplikacja otrzymuje swój Bundle ID przy tworzeniu projektu, a identyfikator ten pozostaje niezmienny przez cały cykl życia. Według Apple Developer Documentation, Bundle ID jest używany do przypisywania usług, certyfikatów i profili podpisu.
Najważniejsze
Bundle Identifier — to ciąg znaków, który jednoznacznie identyfikuje aplikację w systemie operacyjnym i sklepie z aplikacjami. W iOS i macOS nazywa się Bundle ID, w Android — Package Name, choć funkcjonalnie oba pełnią tę samą rolę: zapewniają unikalność aplikacji na urządzeniu i w sklepie.
System operacyjny używa Bundle ID do rozróżniania aplikacji na urządzeniu. Dwie aplikacje z tym samym identyfikatorem nie mogą być zainstalowane jednocześnie — system traktuje je jako ten sam produkt. Sklepy z aplikacjami również sprawdzają unikalność Bundle ID przy publikacji.
Apple wprowadziło Bundle ID wraz z wydaniem iOS SDK w 2008 roku. Format reverse domain notation został zapożyczony z Javy (package naming convention), gdzie używany jest do zapobiegania konfliktom nazw klas. Google przejął tę praktykę dla Androida, co zapewniło jednolitość w obu mobilnych ekosystemach.
| Platforma | Nazwa pola | Przykład |
|---|---|---|
| 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 składa się z kilku segmentów oddzielonych kropkami. Pierwsza część — identyfikator programisty lub firmy (com, org, net). Druga — domena firmy (example, google, apple). Kolejne segmenty określają nazwę aplikacji i platformy.
Typowy Bundle ID wygląda jak com.company.appname. Apple zaleca używanie odwrotnego zapisu nazwy domeny, aby zagwarantować globalną unikalność. Jeśli firma nie ma domeny, dopuszcza się użycie emaila: com.example.myapp lub org.example.myapp.
Apple obsługuje Wildcard Bundle ID — szablon identyfikatora z gwiazdką: com.example.*. Taki szablon pozwala używać jednego App ID dla kilku aplikacji jednej firmy. Wildcard ID jest wygodny na etapie rozwoju, ale nie jest zalecany do produkcji, ponieważ ogranicza używanie niektórych usług Apple.
Ograniczenia wildcard: Push-Notifications, CloudKit, In-App Purchase i Game Center wymagają dokładnego (explicit) Bundle ID. Przy użyciu szablonu com.example.* te usługi są niedostępne. Dla aplikacji produkcyjnych zawsze używaj explicit Bundle ID, aby zapewnić pełną funkcjonalność wszystkich usług Apple.
Oprócz wildcard, Apple obsługuje identyfikatory prefiksowe, które są przypisywane zespołom programistów przy rejestracji w Apple Developer Program. Prefiks (Team ID) jest automatycznie dodawany do wszystkich App ID i profili podpisu. Dwa różne Team ID mogą utworzyć ten sam Bundle ID, ale na urządzeniu są one uznawane za różne aplikacje.
Rejestracja Bundle ID — obowiązkowy etap przed publikacją aplikacji. W ekosystemie Apple rejestracja odbywa się w Apple Developer Portal przez sekcję Certificates, Identifiers & Profiles. W Google Play Bundle ID jest podawany przy tworzeniu aplikacji w konsoli programisty.
Na portalu Apple Developer wybierz sekcję Identifiers, kliknij przycisk Register i określ typ App ID. Wprowadź dokładną nazwę Bundle ID i wybierz niezbędne capabilities: Push Notifications, CloudKit, Sign in with Apple. Po rejestracji identyfikator staje się dostępny do tworzenia profili podpisu.
// Sprawdzanie Bundle ID w kodzie aplikacji
let bundleID = Bundle.main.bundleIdentifier
print("Aktualny Bundle ID: \(bundleID ?? "unknown")")
// Sprawdzanie Bundle ID dla warunków kompilacji
if bundleID == "com.example.app.production" {
// Konfiguracja produkcyjna
Analytics.shared.configure(.production)
}
Google Play Console nie wymaga wcześniejszej rejestracji Bundle ID. Identyfikator jest podawany w pliku build.gradle modułu aplikacji i musi być unikalny w ramach całego Google Play. Po utworzeniu aplikacji zmiana Package Name jest niemożliwa, dlatego wybieraj identyfikator starannie i sprawdź jego unikalność przez wyszukiwanie w Google Play. Google nie zwalnia identyfikatorów usuniętych aplikacji, więc zajęty raz Bundle ID pozostaje niedostępny dla innych programistów.
Przy rejestracji w App Store Connect należy podać Bundle ID z istniejącego zestawu zarejestrowanych identyfikatorów. Jeśli identyfikator nie jest jeszcze zarejestrowany na portalu Apple Developer, system zaproponuje utworzenie go automatycznie. Po rejestracji Bundle ID jest przypisywany do zespołu i nie może być przeniesiony na inne konto programisty bez kontaktu z pomocą Apple. Każdy Bundle ID może mieć kilka profili podpisu dla różnych środowisk: Development, Ad Hoc, App Store.
Przy rejestracji Bundle ID dla aplikacji iOS z rozszerzeniami konieczna jest rejestracja każdego komponentu osobno. Rozszerzenia widgetów, klawiatury, Notification Service i Watch App mają własne identyfikatory pochodne od głównego. App Store Connect łączy je w grupę przy tworzeniu App Record, co pozwala publikować wszystkie komponenty jako jedną aplikację.
Konfiguracja Bundle ID w Xcode odbywa się w kilku miejscach: Info.plist, Build Settings i Signing & Capabilities. Centralne pole — Bundle Identifier w targecie aplikacji. Wszystkie usługi Apple, od Push-Notifications po CloudKit, są przypisywane do tego identyfikatora. Nieprawidłowo podany Bundle ID prowadzi do błędów podpisu i niemożliwości publikacji w App Store.
<!-- Info.plist — podstawowy Bundle ID projektu -->
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<!-- Build Settings — zmienna PRODUCT_BUNDLE_IDENTIFIER -->
<!-- Debug: com.example.app.dev -->
<!-- Release: com.example.app -->
Xcode używa zmiennej PRODUCT_BUNDLE_IDENTIFIER w Build Settings. Dla różnych konfiguracji kompilacji można ustawić różne wartości: com.example.app.dev dla Debug i com.example.app dla Release. Jest to wygodne do równoległej instalacji wersji deweloperskiej obok produkcyjnej na jednym urządzeniu do testowania.
Jeśli aplikacja ma rozszerzenia (Notification Service, Widget, Watch App), każde rozszerzenie otrzymuje własny Bundle ID z sufiksem. Główna aplikacja: com.example.app. Rozszerzenie widgetu: com.example.app.widget. Watch App: com.example.app.watchkit. Każdy identyfikator jest rejestrowany osobno w Apple Developer Portal i otrzymuje oddzielny profil podpisu. Xcode automatycznie zarządza tymi zależnościami przy kompilacji.
App Bundle ID (Apple) i Package Name (Google) — to analogiczne encje z tym samym przeznaczeniem, ale różnymi zasadami użycia w ekosystemach iOS i Android. Oba identyfikatory używają reverse domain notation i nie mogą być zmienione po publikacji w oficjalnych sklepach z aplikacjami.
W ekosystemie Apple Bundle ID jest powiązany z profilem podpisu i certyfikatami. Przy zmianie zespołu programistów Bundle ID można przenieść między kontami przez App Store Connect. W Android Package Name jest sztywno przypisany do aplikacji w Google Play i nie może być przeniesiony między kontami programistów.
| Charakterystyka | iOS Bundle ID | Android Package Name |
|---|---|---|
| Maksymalna długość | Nieograniczona | 150 znaków |
| Separator segmentów | Kropka (.) | Kropka (.) |
| Dozwolone znaki | A-Z, a-z, 0-9, kropka, myślnik | A-Z, a-z, 0-9, kropka, podkreślenie |
| Wildcard | Obsługiwany (*) | Nieobsługiwany |
| Użycie w kodzie | Bundle.main.bundleIdentifier | BuildConfig.APPLICATION_ID |
Pomimo różnic, oba identyfikatory pełnią krytyczną rolę: bez nich nie można opublikować aplikacji w oficjalnym sklepie. Zalecenie dla projektów cross-platformowych — używaj tego samego identyfikatora w wersjach iOS i Android, aby uprościć integrację z Firebase, Analytics i innymi usługami. Ułatwia to również nawigację dla zespołu programistów: jeden identyfikator dla obu projektów zmniejsza zamieszanie przy konfiguracji CI/CD i konfiguracji środowisk.
Przy tworzeniu aplikacji przy użyciu Flutter lub React Native jednolity identyfikator jest szczególnie ważny, ponieważ baza kodu jest wspólna, a wiele narzędzi automatycznej kompilacji oczekuje tej samej nazwy pakietu dla obu platform. Projekt Firebase również jest przypisywany do jednego identyfikatora dla iOS i Android, co upraszcza konfigurację analityki i raportowania błędów.
Często zadawane pytania
Zmiana Bundle ID po publikacji w App Store lub Google Play jest niemożliwa. System odbierze nowy identyfikator jako całkowicie inną aplikację. Do aktualizacji istniejącego produktu Bundle ID musi pozostać niezmienny przez cały cykl życia aplikacji.
Urządzenie iOS lub Android nie pozwoli na zainstalowanie drugiej aplikacji z tym samym identyfikatorem na pierwszej. System wyświetli błąd i zaproponuje usunięcie istniejącej aplikacji. W sklepach publikacja z duplikującym się Bundle ID również zostanie zablokowana.
Użyj reverse domain notation swojej firmy: com.nazwafirmy.nazwaaplikacji. Unikaj myślników i specjalnych znaków. Jeśli aplikacja ma rozszerzenia, dodaj sufiksy przez kropkę. Upewnij się, że identyfikator jest unikalny i nie jest zajęty przez innego programistę.
Tak, każde rozszerzenie — widget, Watch App, Notification Service — wymaga własnego Bundle ID. Identyfikatory tworzą hierarchię: com.example.app jako podstawowy, com.example.app.widget dla widgetu, com.example.app.watchkit dla Watch. Wszystkie są rejestrowane osobno w Apple Developer Portal i używają wspólnego App ID z aplikacją nadrzędną.
Bundle ID — to ciąg identyfikatora w kodzie aplikacji. App ID — to obiekt w Apple Developer Portal, który łączy Bundle ID z zestawem włączonych usług (capabilities). App ID jest tworzony na podstawie Bundle ID i używany do generowania profili podpisu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również