.entitlements は、iCloudやPush通知などを利用するために、Xcodeがビルド・署名時に使う設定ファイルです。ざっくり言えば、アプリに必要な「許可リストのもと」になるファイルです。
Swiftコードから直接読み込むファイルではありません。また、ユーザーが通知やカメラの使用を許可する操作とも別のものです。
通常はXMLを手書きせず、Xcodeの Signing & Capabilities から使いたい機能を追加します。するとXcodeが、必要に応じてentitlementsファイルを作成・更新します。
自分は何をすればよいのか
状況ごとに分けると、最初に行うことは次のとおりです。
- すでにファイルがある
理由が分からないまま削除・編集せず、Signing & Capabilitiesに追加されている機能を確認します。 - iCloudなどの機能を追加したい
Xcodeで青いプロジェクトアイコンを選び、アプリ本体のTargetからSigning & Capabilitiesを開きます。次に+ Capabilityから使いたい機能を追加します。 - 実際に機能を動かしたい
Capabilityの追加後に、その機能に必要なアプリ側のコードやサーバー側の設定などを行います。
ここでいうTargetは、どのアプリをビルドするかをまとめた設定です。Capabilityは、iCloudやPush通知などの追加機能をXcodeで設定するための項目です。
この手順は、XcodeのSigningでTeamを選び、通常のビルドができる状態を前提にしています。
CloudKitの場合は、iCloud Capabilityを追加し、CloudKit と利用するContainerを選びます。Containerは、CloudKitでデータを保存する領域です。
Push通知の場合は、Push Notifications Capabilityを追加します。通知を画面に表示するならユーザーへ許可を求め、アプリをAPNsへ登録します。一般的なリモート通知では、取得したデバイストークンを送信サーバーへ渡し、サーバーからAPNsへ通知を送る仕組みも必要です。
「何のファイルか」と「どこで設定するか」だけ知りたかった方は、ここまで押さえれば十分です。
ここからは、Swiftコードから参照されない理由や、朝の実の具体例をもう少し詳しく見ていきます。
Swiftコードから直接参照されない理由
.entitlements は、アプリの実行中にSwiftコードが読み込むためのファイルではありません。
Xcodeはアプリをビルド・署名するときに、entitlementsファイル、Developer Account、プロジェクト設定などを組み合わせ、最終的なentitlementをアプリのコード署名へ反映します。
そのため、Swiftコードからファイル名を検索しても、Asanomi.entitlements を開く処理は見つかりません。Xcodeがビルド時に使うからです。
朝の実では、Build Settingsの CODE_SIGN_ENTITLEMENTS が Asanomi/App/Asanomi.entitlements を参照しています。つまり、このファイルはSwiftコードではなく、Xcodeのビルド設定から使われています。
なお、Asanomi.entitlements の Asanomi はファイル名で、.entitlements は拡張子です。多くの場合、アプリやTargetの名前がファイル名に使われます。
朝の実には何が設定されているのか
朝専用SNS「朝の実」の Asanomi.entitlements には、現在、次の3つが設定されています。
| 何の設定か | 朝の実の値 |
|---|---|
| Push通知で利用するAPNsの環境 | development |
| 利用するiCloud Container | iCloud.com.usamaron.Asanomi |
| 利用するiCloudサービス | CloudKit |
朝の実では、iCloud.com.usamaron.Asanomi というContainerでCloudKitを利用する設定になっています。
Swiftコード側では、Bundle IDに iCloud. を付けてContainer IDを組み立てています。現在のBundle IDでは iCloud.com.usamaron.Asanomi となるため、entitlementsの設定と一致します。
朝の実は、このContainerのPublic Databaseを使って投稿データを保存・取得しています。
実際のXML
実際のファイルから、設定部分だけを抜き出すと次のようになります。
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.usamaron.Asanomi</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
<string>CloudKit</string>
</array>
</dict><key> が項目名で、<string> が文字列の値です。<array> は、値を複数並べられる入れ物です。
aps-environment は、Apple Push Notification service(APNs)を利用する環境を表す設定です。CloudKitを有効にするとXcodeがPush Notifications Capabilityも追加するため、このキーがあるだけでユーザー向けのPush通知を実装しているとは限りません。development / production は署名に応じて決まるため、通常は手動で書き換えません。
Info.plist やユーザーの許可とは何が違うのか
.entitlements と Info.plist は、どちらもProperty List形式なので似て見えます。しかし、担当する役割は異なります。
| 要素 | 主な役割 | 例 |
|---|---|---|
.entitlements | コード署名へ反映する権利設定の入力 | iCloud Container、APNs環境 |
Info.plist | OSがアプリの情報や構成を確認するための設定 | 表示名、カメラを使う理由 |
| ユーザーの許可 | 利用者がダイアログ上で利用を認める操作 | 通知、カメラ、写真 |
同じ機能でも、複数の設定が必要になる場合があります。
たとえばPush通知では、entitlementの設定に加えて、ユーザーへの通知許可やAPNsへの登録などが必要です。Info.plist やユーザーの許可が、entitlementsの代わりになるわけではありません。
まとめ
.entitlements は、iCloudやPush通知などを利用するために、Xcodeがビルド・署名時に参照する設定ファイルです。
まず覚えておきたいのは、次の3点です。
- 基本は
Signing & Capabilitiesから設定する - 理由が分からないまま削除したり、XMLを手書きしたりしない
- 機能に応じて、アプリ側のコードやサーバー側の設定も別に行う
「Xcodeで使いたい機能を追加する」「entitlementsで権利設定を確認する」「必要な実装や設定を追加する」という関係で考えると、ファイルの役割を整理しやすいと思います。
参考資料
- Entitlements – Apple Developer Documentation
- Adding capabilities to your app – Apple Developer Documentation
- Enabling CloudKit in Your App – Apple Developer Documentation
- APS Environment Entitlement – Apple Developer Documentation
- Registering your app with APNs – Apple Developer Documentation
- Build settings reference – Apple Developer Documentation
- Information Property List – Apple Developer Documentation
