App Bundle ID — What It Is, App Identifier, and Registration

Author: IT Sectr Published: 2026-04-17 Reading time: 8 min

App Bundle ID — is a unique application identifier used in the Apple and Google ecosystems for registration, signing, and distribution of a software product. Each app gets its Bundle ID when the project is created, and this identifier remains unchanged throughout its entire lifecycle. According to Apple Developer Documentation, Bundle ID is used for tying services, certificates, and provisioning profiles.

Key Takeaways

  • App Bundle ID — a global identifier, unique for each app in the store
  • Format is based on reverse domain notation: com.company.appname
  • Registration is performed in App Store Connect and Google Play Console
  • Changing Bundle ID after publication is impossible without creating a new app
  • Services (Push, CloudKit, Firebase) are tied through Bundle ID

What is App Bundle ID

Bundle Identifier is a string that uniquely identifies an app in the operating system and app store. In iOS and macOS it is called Bundle ID, in Android — Package Name, although functionally both serve the same role: they ensure app uniqueness on the device and in the store.

Purpose of Bundle ID

The operating system uses Bundle ID to differentiate apps on the device. Two apps with the same identifier cannot be installed simultaneously — the system treats them as the same product. App stores also check Bundle ID uniqueness during publication.

History and Naming Standards

Apple introduced Bundle ID with the release of the iOS SDK in 2008. The reverse domain notation format was borrowed from Java (package naming convention), where it is used to prevent class name conflicts. Google adopted this practice for Android, ensuring consistency across both mobile ecosystems.

PlatformField NameExample
iOS/macOSBundle Identifiercom.example.myapp
AndroidPackage Namecom.example.myapp
watchOSBundle Identifiercom.example.myapp.watchkit
tvOSBundle Identifiercom.example.myapp.tvos

How Bundle ID Format Works

Bundle ID consists of several segments separated by dots. The first part is the developer or company identifier (com, org, net). The second is the company domain (example, google, apple). Subsequent segments specify the app name and platform.

Bundle ID Structure

A typical Bundle ID looks like com.company.appname. Apple recommends using reverse domain notation to guarantee global uniqueness. If the company does not have a domain, using email is allowed: com.example.myapp or org.example.myapp.

  • Segment 1 — TLD in reverse order: com, org, io, net
  • Segment 2 — company or developer domain: google, apple, mycompany
  • Segment 3 — app name: maps, mail, notes
  • Additional — platform or extension: watchkit, todaywidget

Wildcard Bundle ID

Apple supports Wildcard Bundle ID — an identifier template with an asterisk: com.example.*. This template allows using one App ID for multiple apps from the same company. Wildcard ID is convenient during development but is not recommended for production as it limits the use of some Apple services.

Wildcard limitations: Push notifications, CloudKit, In-App Purchase, and Game Center require an explicit Bundle ID. When using the com.example.* template, these services are unavailable. For production apps, always use an explicit Bundle ID to ensure full functionality of all Apple services.

In addition to wildcard, Apple supports prefix identifiers that are assigned to a development team upon registration in the Apple Developer Program. The prefix (Team ID) is automatically added to all App IDs and provisioning profiles. Two different Team IDs may create the same Bundle ID, but on the device they are considered different apps.

Registering Bundle ID in Consoles

Bundle ID registration is a mandatory step before publishing an app. In the Apple ecosystem, registration is performed in the Apple Developer Portal through the Certificates, Identifiers & Profiles section. In Google Play, Bundle ID is specified when creating the app in the developer console.

Registration in Apple Developer Portal

On the Apple Developer portal, select the Identifiers section, click the Register button, and specify the App ID type. Enter the exact Bundle ID name and select the required capabilities: Push Notifications, CloudKit, Sign in with Apple. After registration, the identifier becomes available for creating provisioning profiles.

swift
// Checking Bundle ID in App Code
let bundleID = Bundle.main.bundleIdentifier
print("Current Bundle ID: \(bundleID ?? "unknown")")

// Checking Bundle ID for Build Conditions
if bundleID == "com.example.app.production" {
    // Production Configuration
    Analytics.shared.configure(.production)
}

Registration in Google Play Console

Google Play Console does not require prior Bundle ID registration. The identifier is specified in the build.gradle file of the app module and must be unique across the entire Google Play. After creating the app, it is impossible to change the Package Name, so choose the identifier carefully and check its uniqueness through a Google Play search. Google does not release identifiers of removed apps, so a Bundle ID once taken remains unavailable to other developers.

When registering in App Store Connect, you must specify a Bundle ID from the existing set of registered identifiers. If the identifier has not yet been registered on the Apple Developer portal, the system will offer to create it automatically. After registration, the Bundle ID is tied to the team and cannot be transferred to another developer account without contacting Apple support. Each Bundle ID can have multiple provisioning profiles for different environments: Development, Ad Hoc, App Store.

When registering a Bundle ID for an iOS app with extensions, each component must be registered separately. Widget extensions, keyboards, Notification Service, and Watch App have their own identifiers derived from the main one. App Store Connect groups them when creating an App Record, allowing all components to be published as a single app.

Configuring Bundle ID in Xcode Project

Bundle ID configuration in Xcode is done in several places: Info.plist, Build Settings, and Signing & Capabilities. The central field is Bundle Identifier in the app target. All Apple services, from Push notifications to CloudKit, are tied to this identifier. An incorrectly specified Bundle ID leads to signing errors and the inability to publish to the App Store.

Changing Bundle ID in Xcode

xml
<!-- Info.plist — Base Bundle ID of the Project -->
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>

<!-- Build Settings — PRODUCT_BUNDLE_IDENTIFIER Variable -->
<!-- Debug: com.example.app.dev -->
<!-- Release: com.example.app -->

Xcode uses the PRODUCT_BUNDLE_IDENTIFIER variable in Build Settings. Different values can be set for different build configurations: com.example.app.dev for Debug and com.example.app for Release. This is convenient for installing a dev version alongside the production version on the same device for testing.

Multi-Target Configuration

If the app has extensions (Notification Service, Widget, Watch App), each extension gets its own Bundle ID with a suffix. Main app: com.example.app. Widget extension: com.example.app.widget. Watch App: com.example.app.watchkit. Each identifier is registered separately in the Apple Developer Portal and receives its own provisioning profile. Xcode automatically manages these dependencies during build.

Differences Between App Bundle ID and Package Name

App Bundle ID (Apple) and Package Name (Google) are similar entities with the same purpose but different usage rules in the iOS and Android ecosystems. Both identifiers use reverse domain notation and cannot be changed after publication in official app stores.

Functional Differences

In the Apple ecosystem, Bundle ID is tied to provisioning profiles and certificates. When changing development teams, the Bundle ID can be transferred between accounts through App Store Connect. In Android, Package Name is strictly tied to the app in Google Play and cannot be transferred between developer accounts.

CharacteristiciOS Bundle IDAndroid Package Name
Maximum LengthUnlimited150 characters
Segment SeparatorDot (.)Dot (.)
Allowed CharactersA-Z, a-z, 0-9, dot, hyphenA-Z, a-z, 0-9, dot, underscore
WildcardSupported (*)Not supported
Usage in CodeBundle.main.bundleIdentifierBuildConfig.APPLICATION_ID

Despite the differences, both identifiers play a critical role: without them, it is impossible to publish an app in an official store. Recommendation for cross-platform projects — use the same identifier in iOS and Android versions to simplify integration with Firebase, Analytics, and other services. This also simplifies navigation for the development team: one identifier for both projects reduces confusion when setting up CI/CD and environment configuration.

When developing with Flutter or React Native, a single identifier is especially important since the codebase is shared and many automated build tools expect the same package name for both platforms. A Firebase project is also tied to a single identifier for iOS and Android, simplifying analytics and crash reporting setup.

Frequently Asked Questions

Can I change the Bundle ID after publishing the app?

Changing Bundle ID after publication in the App Store or Google Play is impossible. The system will treat the new identifier as a completely different app. To update an existing product, the Bundle ID must remain unchanged throughout the entire app lifecycle.

What happens if two apps have the same Bundle ID?

An iOS or Android device will not allow installing a second app with the same identifier on top of the first. The system will display an error and suggest deleting the existing app. In stores, publication with a duplicate Bundle ID will also be blocked.

How to correctly choose a Bundle ID for a new project?

Use reverse domain notation of your company: com.companyname.appname. Avoid hyphens and special characters. If the app has extensions, add suffixes separated by dots. Make sure the identifier is unique and not taken by another developer.

Does each app extension need a separate Bundle ID?

Yes, each extension — widget, Watch App, Notification Service — requires its own Bundle ID. The identifiers form a hierarchy: com.example.app as the base, com.example.app.widget for the widget, com.example.app.watchkit for Watch. All are registered separately in the Apple Developer Portal and share a common App ID with the parent app.

What is the difference between Bundle ID and App ID in the Apple Developer portal?

Bundle ID is an identifier string in the app code. App ID is an object in the Apple Developer Portal that combines a Bundle ID with a set of enabled services (capabilities). App ID is created based on Bundle ID and is used for generating provisioning profiles.

Summary

  • App Bundle ID — a unique app identifier in iOS and Android ecosystems
  • Format is based on reverse domain notation: com.company.appname
  • Changing Bundle ID after publication is impossible without creating a new app in the store
  • Wildcard Bundle ID com.example.* is convenient for development but incompatible with Push, CloudKit, and In-App Purchase
  • Extensions get their own Bundle IDs with dot-separated suffixes
  • Registration is performed in the Apple Developer Portal and Google Play Console respectively
  • Recommendation — choose the identifier thoughtfully, verify uniqueness before publication

We will develop a mobile application turnkey

IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.

Discuss the project

Read also