CloudKitを利用した設計

CloudKitは、管理のしやすさ、柔軟性、パワーを追求した設計になっています。アプリをコンテナに整理することで各アプリを確実にサイロ化するので、アプリのデータがほかのアプリの中に紛れ込むことはありません。専用のデータベースとゾーンを使えば、アクセスの種類や機能ごとにアプリの情報を分けるのも簡単です。また、CloudKitには効率的な同期機能や共有機能に加えて、包括的な機能セットが用意されているため、パワフルなクラウドアプリを簡単に開発できます。

コンテナ

CloudKitは、コンテナと呼ばれる論理空間を使ってデータを整理します。通常、1つのCloudKit アプリは1つのコンテナを使ってプロダクション環境のデータすべてを格納しますが、1つのアプリが複数のコンテナを使ったり、複数のアプリで1つのコンテナを使用するよう構成することもできます。各コンテナはCloudKit内のアプリのストレージを表し、アプリのデータをサイロ化します。アプリのスキーマはそのコンテナ内で管理します。

データベース

コンテナには、異なる種類のデータベース(パブリック、プライベート、および共有データベース)を含めることができます。各コンテナには、アプリのすべてのユーザー間で共有されるパブリックデータベースが1つあります。アプリの各ユーザーは、自分だけのプライベートデータベースに加えて、ほかのユーザーと情報を共有できる共有データベースにもアクセスできます(以下を参照)。

デベロッパやユーザーはこれらのデータベースを使い分けることで、複雑なアクセス制御リスト(ACL)モデルを実装しなくても、データアクセスを管理できます。たとえば、アプリの多数のユーザーにデータを公開する場合、アプリのパブリックデータベースを構成することで簡単に実現できます。ユーザーがデータを自分専用にとどめたい場合は、自分のプライベートデータベースにデータを公開することができます。一部のデータをほかのユーザーと明示的に共有する場合は、共有データベースでデータを表示して編集できるように特定のユーザーを招待できます。

ゾーン

CloudKitのデータベースには、データレコードを論理的に分けたゾーンが含まれています。パブリックデータベースにはゾーンが1つだけあり、これをデフォルトゾーンと呼んでいます。各プライベートデータベースにもデフォルトゾーンがありますが、データベースを複数のカスタムゾーンに分けることもできます。共有データベースにはデフォルトゾーンがありません(以下を参照)。

レコードがパブリックデータベースまたはプライベートデータベースに保存されると、デフォルトでそのデータベースのデフォルトゾーンに配置されます。ただし、プライベートデータベース内のカスタムゾーンにレコードを配置することもできます。カスタムゾーンは、特定の目的で関連するレコードをグループ化する場合に役立ちます。たとえば、プライベートデータベースにはさまざまな種類のデータがあり、それらのデータをデバイス上で異なる頻度で更新する必要がある場合、データを種類に応じて別々のゾーンにグループ分けし、ゾーン単位で変更内容を同期できます。これにより、すべてのゾーンを一度に同期する必要がなくなり、不要なデータ転送をなくすことができます。

環境

CloudKitは、プロジェクトとアプリにおいて独立した開発環境とプロダクション環境を提供しています。プロジェクトがまだ開発段階にある場合は、コンテナのスキーマとレコードはSandbox環境に保存されるため、ユーザーが利用する前にデータベーススキーマをテストしたり実験したりできます。Sandbox環境にアクセスできるのは開発チームのメンバーだけです。

スキーマの開発が終わったら、プロモーションと呼ばれるプロセスを経て、スキーマをプロダクション環境に移行できます。プロモーションを行ったスキーマは、上位互換性のある方法でのみ変更できます。そのため、エンティティタイプは削除できません。エンティティにフィールドを追加することはできますが、フィールドを変更したり削除したりすることはできません。通常はクライアントのアップデートの頻度を制御できないため、この方法により、古いクライアントとスキーマの変更との連係を確保できます。アプリをテスト用に配信する準備ができたら、開発環境のスキーマをプロダクション環境に移行し、レコード型、フィールド、インデックスをコピーします。なお、App Storeで販売されているアプリは、プロダクション環境にしかアクセスできません。

アクセス権とアクセス制御

CloudKitは役割ベースのアクセス制御(RBAC)を使ってアクセス権を管理し、パブリックデータベースのデータへのアクセスを制御します(プライベートデータベースはそもそもアクセスが制限されています)。CloudKitでは、役割にアクセス権レベルを設定し、その役割を所定のレコード型に割り当てます。

アクセス権には読み取り、書き込み、作成があり、これらの権限は追加型です。つまり、読み取りアクセス権ではレコードの読み取りのみ、書き込みアクセス権ではレコードの読み取りと書き込み、作成アクセス権ではレコードの読み取りと書き込みに加え、新しいレコードの作成が許可されます。

役割には、World、Authenticated、Creatorがあります。Worldの役割には、認証済みかどうかに関係なく、すべてのiCloudユーザーが含まれます。Authenticatedの役割には、サインイン済みで認証済みのすべてのiCloudユーザーが含まれます。Creatorの役割には、レコードを作成した認証済みのユーザーだけが含まれます。

接続性

CloudKitは強整合性のストレージを提供しており、データをユーザーのデバイス間や複数のユーザー間で簡単に共有できます。データが共有されるため、アプリでローカルレコードの同期を常に維持することも必要です。CloudKitのネイティブフレームワークではアプリのデータをCloudKitコンテナに保存できるため、ユーザーは複数のデバイスからアプリのデータにアクセスできます。