App Bundle ID — は、AppleおよびGoogleのエコシステムでソフトウェア製品の登録、署名、配布に使用される一意のアプリケーション識別子です。各アプリはプロジェクト作成時にBundle IDを取得し、この識別子はライフサイクル全体を通じて変更されません。Apple Developer Documentationによると、Bundle IDはサービス、証明書、プロビジョニングプロファイルの関連付けに使用されます。
主要ポイント
Bundle Identifier は、オペレーティングシステムとアプリストアでアプリケーションを一意に識別する文字列です。iOSとmacOSではBundle IDと呼ばれ、AndroidではPackage Nameと呼ばれますが、機能的にはどちらも同じ役割を果たします:デバイスとストアでのアプリの一意性を確保します。
オペレーティングシステムは、デバイス上のアプリを区別するために Bundle ID を使用します。同じ識別子を持つ2つのアプリは同時にインストールできません — システムはそれらを同じ製品として扱います。アプリストアも公開時にBundle IDの一意性をチェックします。
Appleは2008年のiOS SDKリリースとともに Bundle ID を導入しました。リバースドメイン表記形式はJava(パッケージ命名規則)から借用され、クラス名の競合を防ぐために使用されています。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)です。2番目は会社のドメイン(example、google、apple)です。後続のセグメントはアプリ名とプラットフォームを指定します。
典型的なBundle IDは com.company.appname のようになります。Appleはグローバルな一意性を保証するためにリバースドメイン表記を使用することを推奨しています。会社にドメインがない場合は、メールの使用が許可されています:com.example.myapp または org.example.myapp。
Appleは Wildcard Bundle ID — アスタリスク付きの識別子テンプレートをサポートしています:com.example.*。このテンプレートを使用すると、同じ会社の複数のアプリで1つのApp IDを使用できます。Wildcard IDは開発中は便利ですが、一部のAppleサービスの使用を制限するため、本番環境では推奨されません。
ワイルドカードの制限: プッシュ通知、CloudKit、アプリ内購入、Game Centerには明示的な(explicit)Bundle IDが必要です。com.example.* テンプレートを使用する場合、これらのサービスは利用できません。本番アプリでは、すべてのAppleサービスの完全な機能を確保するために、常にexplicit Bundle IDを使用してください。
ワイルドカードに加えて、AppleはApple Developer Programへの登録時に開発チームに割り当てられる プレフィックス識別子 もサポートしています。プレフィックス(Team ID)は、すべてのApp IDとプロビジョニングプロファイルに自動的に追加されます。異なる2つの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名を入力し、必要な機能(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などの異なる環境用に複数のプロビジョニングプロファイルを持つことができます。
拡張機能を持つiOSアプリの Bundle ID を登録する場合、各コンポーネントを個別に登録する必要があります。ウィジェット拡張機能、キーボード、Notification Service、Watch Appには、メインから派生した独自の識別子があります。App Store ConnectはApp Record作成時にそれらをグループ化し、すべてのコンポーネントを単一のアプリとして公開できるようにします。
Xcodeでの Bundle ID設定 は、Info.plist、Build Settings、Signing & Capabilitiesの複数の場所で行います。中心となるフィールドはアプリターゲットのBundle Identifierです。プッシュ通知からCloudKitまで、すべてのAppleサービスがこの識別子に紐づけられます。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はBuild Settingsで PRODUCT_BUNDLE_IDENTIFIER 変数を使用します。ビルド構成ごとに異なる値を設定できます:Debug用にcom.example.app.dev、Release用にcom.example.app。これにより、テスト用に同じデバイスに本番バージョンと一緒に開発バージョンをインストールするのに便利です。
アプリに拡張機能(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のエコシステムで異なる使用ルールがあります。両方の識別子はリバースドメイン表記を使用し、公式アプリストアでの公開後に変更することはできません。
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、ドット、アンダースコア |
| ワイルドカード | サポート (*) | サポートなし |
| コード内での使用 | Bundle.main.bundleIdentifier | BuildConfig.APPLICATION_ID |
違いはあるものの、両方の識別子は重要な役割を果たします:それらなしでは公式ストアにアプリを公開することはできません。クロスプラットフォームプロジェクトの 推奨事項 — Firebase、Analytics、その他のサービスとの統合を簡素化するために、iOSとAndroidバージョンで同じ識別子を使用してください。これにより、開発チームのナビゲーションも簡素化されます:両方のプロジェクトで1つの識別子を使用することで、CI/CDのセットアップと環境設定の混乱が減少します。
FlutterまたはReact Native での開発時には、コードベースが共有され、多くの自動ビルドツールが両方のプラットフォームで同じパッケージ名を期待するため、単一の識別子が特に重要です。FirebaseプロジェクトもiOSとAndroidで単一の識別子に紐づけられるため、アナリティクスとクラッシュレポーティングの設定が簡素化されます。
よくある質問
Bundle IDの変更 は、App StoreやGoogle Playでの公開後は不可能です。システムは新しい識別子を完全に別のアプリとして扱います。既存の製品を更新するには、Bundle IDはアプリのライフサイクル全体を通じて変更されないままである必要があります。
iOSまたはAndroid デバイスは、最初のアプリの上に同じ識別子を持つ2番目のアプリをインストールすることを許可しません。システムはエラーを表示し、既存のアプリを削除するよう提案します。ストアでは、重複するBundle IDでの公開もブロックされます。
会社の リバースドメイン表記 を使用してください: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は2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。