Entitlementsは、コード署名フェーズでアプリケーションに割り当てられるデジタル権限であり、Appleオペレーティングシステムの保護された機能へのアクセスを決定します。ユーザー権限とは異なり、Entitlementsはアプリケーション起動時にシステムによってチェックされ、ユーザーが変更することはできません。Apple Developer Documentation (2025)によると、iCloud、プッシュ通知、App Groupsを使用するにはEntitlementsの正しい設定が必須です。EntitlementsはiOSおよびmacOSのセキュリティモデルの重要な要素です。
重要ポイント
Entitlements(英語から“権利”と訳される)は、ビルド時にアプリケーションのコード署名に含まれるキーと値のペアであり、アプリケーションがアクセスできるシステム機能とデータを決定します。EntitlementsはiOS SDKの導入以来Appleのセキュリティモデルに組み込まれており、App Storeを通じて配布されるすべてのアプリケーションに必須です。
Entitlementsの概念はAndroidの従来の権限とは異なります。Androidの権限は機能の初回使用時にユーザーに要求されますが、iOSのEntitlementsはデジタル署名に基づいてアプリケーション起動時にシステムによって検証されます。ユーザーはentitlementを取り消したり変更したりすることはできません。この権利はApp Store Connectを通じて開発者に付与され、プロビジョニングプロファイルに埋め込まれます。
各entitlementには厳密に定義された目的と形式があります。たとえば、com.apple.security.application-groupsは同じ開発者の一連のアプリケーションが共有コンテナにアクセスすることを許可し、aps-environmentはプッシュ通知のサポートを有効にします。AppleはApp Reviewプロセス中にentitlementsリクエストを手動でレビューし、権限の乱用を防ぎます。
Entitlementsは機能的な目的によっていくつかのカテゴリに分類されます。システムサービス — iCloud、プッシュ通知、Siri。セキュリティとデータ — Keychain Access Groups、App Groups、Data Protection。ネットワークと通信 — Multipath TCP、VPN、Hotspot Configuration。ハードウェア機能 — カメラ、マイク、Bluetooth(関連するcapabilitiesを通じて)。
Xcodeは関連するentitlementsをCapabilitiesにグループ化します。Signing & Capabilitiesタブの高レベルスイッチです。Capabilityを有効にすると、必要なentitlementsが自動的に.entitlementsファイルに追加されます。たとえば、プッシュ通知のCapabilityを有効にすると、aps-environment entitlementがdevelopmentまたはproductionの値で追加され、iCloudを有効にするとCloudKitおよびキー値ストレージ用のentitlementsセットが追加されます。
一部のcapabilitiesはApple Developerポータルでの追加設定が必要です。たとえば、App Groupsではポータルでグループ識別子を登録する必要があり、その後Xcodeで選択可能になります。プッシュ通知の場合は、APNsキーまたは証明書を生成する必要があります。これらの準備手順なしでは、正しい.entitlementsファイルがあってもentitlementは機能しません。
com.apple.security.application-groups entitlementを使用すると、同じ開発者の複数のアプリケーションがファイルシステム上で共通のコンテナを共有できます。これはメインアプリケーションと拡張機能(Widget、Watch App、Share Extension)の間でデータを共有するために使用されます。同じグループのすべてのアプリケーションは、共有ディレクトリ/Library/Group Containers/内のファイルを読み書きできます。
Keychain Access Groups(キー keychain-access-groups)は別の重要なentitlementであり、同じグループのアプリケーションがKeychainアイテムへのアクセスを共有できるようにします。これはシングルサインオンを実装するために重要です。ユーザーが1つのアプリケーションにログインすると、パスワードを再入力することなく、別のアプリケーションで同じアカウントに自動的にアクセスできます。
Entitlementsの設定は、Xcodeのターゲット設定にあるSigning & Capabilitiesタブで行います。開発者がリストから必要なCapabilitiesを選択すると、Xcodeが自動的に.entitlementsファイルを作成または更新します。このファイルはplist構造のXML形式でプロジェクトに保存され、そのターゲットのすべてのentitlementキーを含みます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.shared</string>
</array>
<key>aps-environment</key>
<string>development</string>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.example.keychain</string>
</array>
</dict>
</plist>
entitlementファイルを手動で作成する際は、キーの形式とプレフィックスに従うことが重要です。Appleのentitlementsは逆ドメインスタイル(com.apple.*)を使用します。独自の目的のためのカスタムentitlementsも可能ですが、開発者ポータルに登録する必要があります。Xcodeはすべての標準entitlementキーに対してオートコンプリートを提供します。
Entitlementsをデバッグするには、macOSターミナルでcodesignコマンドを使用します。codesign -d --entitlements :- <アプリケーションへのパス>コマンドは、アプリケーションが署名されているすべてのentitlementsを出力します。これは問題の診断に役立ちます。出力にentitlementが欠落している場合、Xcodeの設定に関係なく、アプリケーションは対応する機能にアクセスできません。
XcodeはCapabilitiesを有効にすると自動的にentitlementファイルを生成しますが、経験豊富な開発者は微調整のために手動で作成または編集することがよくあります。ファイルの拡張子は.entitlementsで、形式はplist(XML)です。Xcodeのインターフェースにないカスタムentitlementキーを追加したり、異なるcapabilitiesのentitlementsを1つのファイルに組み合わせたりできます。
手動で編集する際は、XMLの構文の正確性を確保することが重要です。plist構造のエラーがあると、署名時にentitlementsが適用されません。Xcodeはコンパイル時に.entitlementsファイルをチェックし、形式が正しくない場合はエラーを出力します。複数のターゲットと拡張機能を持つ複雑なプロジェクトでは、共通のentitlementキーを別のファイルに保存し、Build Settingsを通じてインポートすることをお勧めします。
// cli: checking entitlements of an installed application
codesign -d --entitlements :- /Applications/Safari.app
// Example output contains a list of active entitlements
<dict>
<key>com.apple.security.ts.apple-wifi</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
EntitlementsはAppleのセキュリティモデルにおいて重要な役割を果たします。entitlementsはアプリケーションのデジタル署名の一部であるため、コードに再署名しなければ改ざんは不可能です。Appleは複数のレベルでentitlementsをチェックします。ビルド時にはXcodeがentitlementsを実行可能ファイルとともに署名し、インストール時にはシステムが署名の整合性をチェックし、起動時にはentitlementsを再検証します。
重要なセキュリティ要件の1つは最小権限の原則です。開発者はアプリケーションで実際に使用されるentitlementsのみを含める必要があります。不要なentitlementsは攻撃対象領域を増やし、App Reviewでアプリケーションが拒否される原因となる可能性があります。Appleはentitlementsがアプリケーションの機能と一致するかどうかを明示的にチェックします。
一部のentitlementsは機密性が高いと見なされ、Appleの追加承認が必要です。これらには、com.apple.developer.healthkit(HealthKit)、com.apple.developer.passkit(Wallet)、com.apple.developer.authentication-services.authentication(Sign in with Apple)、com.apple.developer.nfc.readersession.formats(NFC)が含まれます。これらのentitlementsを取得するには、App Reviewプロセスでその必要性を正当化する必要があります。
Entitlementsを扱う際は、iOSとmacOSの違いを考慮することが重要です。macOSのデスクトップアプリケーション(Sandboxed)は、iOSと比較してより広範なentitlementsセットを持っています。たとえば、com.apple.security.temporary-exception.* entitlementは特定の操作のためにサンドボックスを一時的にバイパスすることを許可しますが、iOSではそのようなentitlementsは完全に存在しません。
Entitlementsはプロビジョニングプロファイルと密接に関連しています。プロビジョニングプロファイルは、開発者証明書、許可されたデバイスのリスト、および特定のアプリケーションのentitlementsセットを結び付けるファイルです。アプリケーションをインストールする際、システムはコード内のentitlementsとプロビジョニングプロファイル内のentitlementsを比較します。entitlementがコードに存在してもプロファイルにない場合、アプリケーションは対応する機能にアクセスできません。
Entitlementsの問題を診断するには、まずプロビジョニングプロファイルを確認します。XcodeはApple Developerポータルで選択されたcapabilitiesに基づいてプロファイルを自動生成します。Xcodeでcapabilityが追加されてもポータルでアクティブでない場合、保護された機能を使用しようとするとアプリケーションは署名エラーでクラッシュします。
iOS開発で最もよく使われるentitlementsを見てみましょう。aps-environment(プッシュ通知)— プッシュ通知を送信するために必須。com.apple.developer.ubiquity-container-identifiers(iCloud)— CloudKitを介したデータ同期のため。com.apple.security.application-groups — アプリケーションと拡張機能間でデータを共有するため。com.apple.developer.associated-domains — Universal LinksとHandoffのため。
これらの各entitlementsには厳格な設定手順があります。プッシュ通知はApple DeveloperポータルでAPNsキーを生成し、Xcodeでcapabilityを有効にする必要があります。その後、entitlementは自動的に.entitlementsファイルに設定されます。iCloudはポータルでコンテナを設定し、Xcodeのドロップダウンリストから選択する必要があります。
Associated Domains — アプリケーションをWebドメインにリンクするentitlementです。Universal Links(アプリケーションで直接開くディープリンク)とHandoff(別のAppleデバイスで作業を継続)に使用されます。entitlementの値にはapplinks:example.com形式の文字列の配列が含まれます。サーバーにapple-app-site-associationファイルを配置する必要があります。
一般的なentitlementsとその目的の表:
| Entitlementキー | 目的 | レビューが必要 |
|---|---|---|
| aps-environment | プッシュ通知 | いいえ |
| com.apple.developer.ubiquity-* | iCloud同期 | いいえ |
| application-groups | 共有アプリコンテナ | いいえ |
| com.apple.developer.healthkit | HealthKitデータ | はい |
| com.apple.developer.nfc.* | NFCタグ読み取り | はい |
| associated-domains | Universal Links | いいえ |
よくある質問
Entitlementsはアプリケーションの署名に埋め込まれ、起動時にシステムによって検証される静的な権利です。権限は実行時にユーザーに要求される動的な許可です(カメラ、位置情報)。
macOSターミナルでcodesign -d --entitlementsコマンドを使用します。App Storeアプリケーションの場合は、ProvisionQLユーティリティまたはXcode Organizerを通じてentitlementsを確認できます。
Entitlementsを変更するには新しいビルドとアプリケーションの再署名が必要です。entitlementにAppleの承認が必要な場合、再度App Reviewを受ける必要があります。再署名なしではentitlementsの変更は不可能です。
.entitlementsファイルは、Xcodeプロジェクトに保存されるplist形式のXMLドキュメントです。アプリケーションのすべてのentitlementsを構造化された形式で含み、実行可能ファイルとともに署名されます。
CapabilitiesはXcodeのSigning & Capabilitiesタブにある高レベルスイッチです。capabilityを有効にすると、対応するentitlementsが自動的に.entitlementsファイルに追加され、プロビジョニングプロファイルが設定されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。