Xcodeにおける「.entitlements」について

朝の実(Asanomi)アイコン 未分類

.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_ENTITLEMENTSAsanomi/App/Asanomi.entitlements を参照しています。つまり、このファイルはSwiftコードではなく、Xcodeのビルド設定から使われています。

なお、Asanomi.entitlementsAsanomi はファイル名で、.entitlements は拡張子です。多くの場合、アプリやTargetの名前がファイル名に使われます。

朝の実には何が設定されているのか

朝専用SNS「朝の実」の Asanomi.entitlements には、現在、次の3つが設定されています。

何の設定か朝の実の値
Push通知で利用するAPNsの環境development
利用するiCloud ContaineriCloud.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 やユーザーの許可とは何が違うのか

.entitlementsInfo.plist は、どちらもProperty List形式なので似て見えます。しかし、担当する役割は異なります。

要素主な役割
.entitlementsコード署名へ反映する権利設定の入力iCloud Container、APNs環境
Info.plistOSがアプリの情報や構成を確認するための設定表示名、カメラを使う理由
ユーザーの許可利用者がダイアログ上で利用を認める操作通知、カメラ、写真

同じ機能でも、複数の設定が必要になる場合があります。

たとえばPush通知では、entitlementの設定に加えて、ユーザーへの通知許可やAPNsへの登録などが必要です。Info.plist やユーザーの許可が、entitlementsの代わりになるわけではありません。

まとめ

.entitlements は、iCloudやPush通知などを利用するために、Xcodeがビルド・署名時に参照する設定ファイルです。

まず覚えておきたいのは、次の3点です。

  • 基本は Signing & Capabilities から設定する
  • 理由が分からないまま削除したり、XMLを手書きしたりしない
  • 機能に応じて、アプリ側のコードやサーバー側の設定も別に行う

「Xcodeで使いたい機能を追加する」「entitlementsで権利設定を確認する」「必要な実装や設定を追加する」という関係で考えると、ファイルの役割を整理しやすいと思います。


参考資料

sho shimizu

SwiftUI を用いた iOS アプリの個人開発を行っています。
これまでに2本のアプリを App Store にリリースしました。

現在は、朝専用SNS「朝の実(Asanomi)」を開発中です。
アプリを作る中で学んだことや、設計・実装で考えたことを、
あとから振り返れるように技術記事としてまとめています。

sho shimizuをフォローする
未分類
シェアする
sho shimizuをフォローする