CloudKitクイックスタート (TP40014987 0.0.0)

CloudKit
クイックスタート
目次
このドキュメントについて 5
関連項目 6
CloudKitの機能を組み込む手順 7
コンテナとデータベースについて 7
設定 8
iCloudを有効にしCloudKitを選択する 10
CloudKit Dashboardにアクセスする 11
アプリケーション間でコンテナを共有する 11
既存のコンテナを共有の対象として追加する 12
カスタムコンテナを生成して共有する 13
ここまでの結果を確認する 14
開発用にiCloudアカウントを生成する 15
まとめ 16
データベーススキーマの作成(レコード保存による方法) 17
スキーマの設計について 17
データをレコード型に分離する 17
レコードに与える名前を決める 19
レコードを生成する 19
レコードを保存する 20
iCloud証明書を入力する(アプリケーション実行前の操作) 21
iCloud証明書を入力するようユーザに警告する 23
アプリケーションを実行する 23
ここまでの結果を確認する 24
CloudKit Dashboardにレコード型を表示する 24
メタデータIDインデックスを有効にする 25
CloudKit Dashboardにレコードを表示する 26
まとめ 27
CloudKit Dashboardによるデータベース管理 28
開発環境と実稼働環境について 28
コンテナを選択する 29
開発環境をリセットする 30
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
2
目次
レコード型を生成、削除する 30
レコードを追加、変更、削除する 32
レコードを検索する 34
レコードを整列する 34
まとめ 35
レコードの取得 36
IDにもとづきレコードを取得する 36
レコードを取得、変更する 36
述語を用いてレコードを検索する 37
まとめ 38
AssetフィールドやLocationフィールドの使い方 40
大容量ファイルをCloudKitに格納する 40
ここまでの結果を確認する 41
Locationフィールドを追加する 41
ここまでの結果を確認する 42
場所を基準にレコードを取得する 43
まとめ 44
参照フィールドの追加 45
スキーマにおける関係のモデル化について 45
参照フィールドを生成する 47
ここまでの結果を確認する 48
参照フィールドをたどってレコードを取得する 49
1対1の関係を解決する 49
1対多の関係を解決する 50
バッチ処理で複数のレコードを保存、取得する 51
所有関係を指定することにより、関連するレコードを自動的に削除する 53
レコードに対する変更を通知するよう登録 54
サブスクリプションをデータベースに保存する 54
ここまでの結果を確認する 56
プッシュ通知を送るよう登録する 57
プッシュ通知に対処するコードを記述する 58
サブスクリプションをテストする 59
まとめ 59
CloudKitアプリケーションのテスト 60
アドホックプロビジョニングを施したiOSアプリケーションを配布する 60
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
3
目次
チームプロビジョニングプロファイルを使ってMacアプリケーションを配布する 62
まとめ 63
スキーマの配備 64
開発環境のスキーマを実稼働環境に配備する 64
ここまでの結果を確認する 65
開発環境におけるスキーマの変更を実稼働環境に反映する 67
使っていないインデックスを無効にする 67
他のチームメンバーに役割を割り当てる 69
まとめ 70
書類の改訂履歴 71
用語解説 72
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
4
このドキュメントについて
この資料では、アプリケーションデータやユーザデータを構造化してiCloudに格納する、CloudKitアプ
リケーションの開発手順を初心者向けに解説します。CloudKitを組み込んだアプリケーションは、複
数のユーザがそれぞれのデバイスから起動し、当該アプリケーション用のデータベースに格納された
レコードにそれぞれアクセスします。多くのデバイス上で動作するアプリケーションが、そのモデル
オブジェクトを永続的に保存、共有したい場合に有用です。このモデルオブジェクトはレコードの形
でデータベースに保存され、自分自身だけでなく他のユーザもアクセスできます。
以下、次の事項を解説します。
●
●
XcodeプロジェクトでCloudKitを有効にし、スキーマを生成する手順(プログラムで、あるいは
CloudKit Dashboardを用いて)
レコードを取得し、変更、登録するコードの書き方
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
5
このドキュメントについて
関連項目
●
大容量データファイルや地理的位置を表すデータに合わせて最適化されたフィールド型の使い方
●
レコードに変更があったとき通知するよう登録し、処理性能を改善する方法
●
●
多数のデバイスを使ってCloudKitアプリケーションをテストする方法(App StoreやMac App Store
にアップロードする前に実施)
実稼働環境にスキーマを配備し、アプリケーションを改訂する際、最新の状態に維持する方法
本書に現れるデータベース用語の定義については、“用語解説” (72 ページ)を参照してください。
関連項目
CloudKitのアーキテクチャやAPIの詳細については、次のWWDCセッションが参考になるでしょう。
●
●
WWDC 2014: Introducing CloudKit :基本的なアーキテクチャと、レコードを保存、取得するAPIの紹
介。
WWDC 2014: Advanced CloudKit :非公開データ、カスタムレコードゾーン、データの整合性維持、
効果的なモデル化手法などのトピック。
関連トピックの詳細については、次の文書を参照してください。
●
●
●
●
『iCloud Design Guide 』の「Designing for CloudKit」:CloudKitの概要。
『App Distribution Quick Start 』:iOSアプリケーションを開発用にプロビジョニングし、デバイス
上で実行する手順。
『AppDistributionGuide 』:プロビジョニングの詳細な手順。アプリケーションサービスの設定、
App StoreやMac App Storeへの登録など。
『Start Developing iOS Apps Today 』または『Start Developing Mac Apps Today 』:Xcodeの概要と、
基本的なアプリケーションの開発手順。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
6
CloudKitの機能を組み込む手順
CloudKitはアプリケーションサービスのひとつですが、App StoreやMac App Storeを通して配布するア
プリケーションからしか使えません。実際に組み込むためには、Xcodeプロジェクト上で追加の設定
が必要です。CloudKitにアクセスする旨のプロビジョニング、およびコード署名をしなければならな
いのです。コード署の際に問題が生じないよう、Xcodeの「Capabilities」ペインで、「CloudKit」を有
効にしておいてください。XcodeやMember Centerで直接エンタイトルメントを編集する必要はないは
ずです。
コンテナとデータベースについて
iCloudには複数のアプリケーションやユーザがアクセスしますが、データはコンテナと呼ばれる区画
に隔離、カプセル化されています。あるアプリケーションに属するコンテナに、別の開発者が開発し
たアプリケーションがアクセスすることはできません。しかし、自分が開発したアプリケーションど
うしであれば、コンテナの共有が可能です。複数のアプリケーションが同じコンテナを共有する一
方、ひとつのアプリケーションが複数のコンテナを使うこともできます。各アプリケーションにはひ
とつだけ、デフォルトコンテナが割り当てられますが、さらに追加でカスタムコンテナを生成できる
のです。デフォルトコンテナのIDは、アプリケーションのバンドルIDと同じです。それ以外のコンテ
ナに指定するIDは、開発者アカウント全体にわたって一意でなければなりません。さらに、コンテナ
は消去不可能です。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
7
CloudKitの機能を組み込む手順
設定
アプリケーションは各コンテナに含まれる、公開および非公開のデータベースにアクセスできます。
公開データベースには、当該アプリケーションの複数のインスタンス間で共有する、ユーザデータや
アプリケーションデータを格納します。公開データベースは誰でも読み取り可能ですが、書き込みに
はiCloud証明書が必要です。一方、非公開データベースはユーザごとに存在します。アプリケーショ
ンは(サインインしている)現ユーザの非公開データベースにしかアクセスできません。ユーザが非
公開データベースを読み書きするためには、当該アプリケーションのiCloud証明書が必要です。
設定
この資料で解説する手順に沿って設定作業を進めるために必要な事項を以下に示します。
●
Macコンピュータ。Xcode 6以降がインストール済みであること
●
OS XおよびXcodeの最新版がインストール済みであることが理想
●
Xcodeプロジェクト(エラーが起こることなくビルドできること)
●
Apple Developer Programの会員であること
●
Member Centerでコード署名やプロビジョニングアセットを作成する権限
以下の作業を済ませた上で、CloudKitを扱う作業を開始してください。具体的な手順は『AppDistribution
Quick Start 』に記載されています。
作業内容
Apple Developer Programに参加する.
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
8
CloudKitの機能を組み込む手順
設定
作業内容
ビルド、実行に用いるXcodeプロジェクトを作成する。
Apple IDを「Accounts」環境設定に追加する。
チームプロビジョニングプロファイルを生成する:
Macアプリケーションの場合、署名IDとして「Mac App Store」を選択。
「Team」ポップアップメニューから該当するチームを選択。
「Fix Issue」をクリック。
Macアプリケーションの場合、「Capabilities」ペインで「App Sandbox」をオンにす
る。
以上の作業を正しく進めると、「General」ペインの「Team」ポップアップメニュー以下にある、エ
ラーメッセージおよび「Fix Issue」ボタンが画面から消えます。コード署名アセットを正常に作成し
た時点の、iOSアプリケーションの「General」ペインの様子を以下に示します。
コード署名やプロビジョニングに際して問題が生じた場合は、『App Distribution Guide 』の
“Troubleshooting”を参照してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
9
CloudKitの機能を組み込む手順
iCloudを有効にしCloudKitを選択する
iCloudを有効にしCloudKitを選択する
iCloudが提供するアプリケーションサービスは3つありますが、CloudKitはそのひとつです。ほかに、
キー値ストレージ、iCloudドキュメントがあり、いずれもXcodeのiCloud設定画面に現れます。CloudKit
を利用するためには、iCloudを有効にした上で、CloudKitサービスを選択する必要があります。
Important: CloudKitを選択すると、XcodeはバンドルIDにもとづき、デフォルトコンテナのIDを生
成します。いったん生成したiCloudコンテナは削除できないので、バンドルIDが正しいことをXcode
の「General」ペインで確認してから、CloudKitを選択するようにしてください。バンドルIDの変更
手順は『App Distribution Quick Start 』の“Set the Bundle ID” in App Distribution Quick Start に載ってい
ます。
iCloudを有効にしCloudKitを選択するには
1.
「Capabilities」ペインで、「iCloud」行のスイッチをオンにしてください。
Xcodeにより、アプリケーションでiCloudを利用できるようにプロビジョニングが施されます(キー
値ストレージははじめから有効になっています)。
2.
「CloudKit」チェックボックスをオンにしてください。
Xcodeは、バンドルIDにもとづきデフォルトCloudKitコンテナを生成するとともに、CloudKitフレー
ムワークをプロジェクトに追加します。
これでアプリケーションがiCloudにデータやドキュメントを保存できるようになりました。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
10
CloudKitの機能を組み込む手順
CloudKit Dashboardにアクセスする
CloudKit Dashboardにアクセスする
CloudKit Dashboardで、CloudKitコンテナのスキーマやレコードを管理できます。スキーマとは、デー
タベース中のレコード、フィールド、関係の編成を記述したもののことです。レコードはあるレコー
ド型のインスタンスです。関係データベースに当てはめると、レコード型はテーブル、レコードはそ
の行に相当します。
CloudKit Dashboardにサインインするには
1.
「Capabilities」ペインの「iCloud」設定にある「CloudKit Dashboard」を押してください。
あるいは直接、https://icloud.developer.apple.com/dashboardに接続しても構いません。
2.
必要に応じてApple ID証明書を入力して「Sign In」をクリックします。
所属する全チームにわたるコンテナがすべて、ウインドウの左上隅にある「コンテナ」ポップ
アップメニューに現れます。いずれかのコンテナ(画面例では「Gallery」)を選択すると、その
アセットが表示されます。
サインアウトするには、ウィンドウ右上隅のアカウンポップアップメニューで「Sign Out」を選択し
ます。
アプリケーション間でコンテナを共有する
ひとつのアプリケーションが複数のコンテナを使う、あるいは他のアプリケーションとコンテナを共
有する設定も可能です。たとえば、レコード型やレコードを内部的に生成して、データベースを既知
の状態に戻す、開発支援アプリケーションを考えてみましょう。このアプリケーションは、開発、テ
スト中のエンドユーザアプリケーションと、同じコンテナを共有する必要があります。そのために
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
11
CloudKitの機能を組み込む手順
アプリケーション間でコンテナを共有する
は、開発支援アプリケーションが、開発中のアプリケーションのデフォルトコンテナを使えるように
しなければなりません。あるいは、両者が共有するカスタムコンテナを生成する、という方法も考え
られます。iOS用とMac用のアプリケーションが、同じコンテナを共有するよう設定することも可能で
す。
既存のコンテナを共有の対象として追加する
他のアプリケーションが使っているコンテナのIDを選択して共有する方法と、共有コンテナを新規に
生成する方法があります。
既存のコンテナを共有の対象として追加するには
1.
「Capabilities」ペインで、「iCloud」設定以下の「Specify custom containers」をオンにしてくださ
い。
CloudKitサービスを選択した時点で、アプリケーションのバンドルIDに一致する、デフォルトのコ
ンテナIDが生成されています。このIDのチェックマークはオンになっています。
2.
必要ならば「Containers」設定欄の下にある「Refresh」ボタンを押して、他のアプリケーション
が使っているコンテナをMember Centerからダウンロードしてください。
3.
共有の対象として追加しようとするコンテナIDのチェックボックスをオンにしてください。
Xcodeはエンタイトルメントファイルに記述されたコンテナIDのリストを更新します。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
12
CloudKitの機能を組み込む手順
アプリケーション間でコンテナを共有する
「Curator」および「Gallery」という2つのアプリケーションが、「Gallery」のデフォルトコンテナ
を共有している様子を以下に示します。
カスタムコンテナを生成して共有する
カスタムコンテナを生成し、複数のアプリケーションで共有するという方法もあります。
Important: コンテナを生成できるのはチーム管理者に限ります。個人として加入した人は、1人
だけから成るチームの(管理者権限を持つ)チームエージェントです。
カスタムコンテナを生成するには
1.
「Use default container」がオンになっている場合は、「Specify custom containers」に切り替えて
ください。
2.
テーブルの下部にある「Add」ボタン(「+」の表示)を押します。
3.
表示されるダイアログで、追加するコンテナIDを入力します。
Warning: コンテナIDは削除できないので、選択する際には十分な注意が必要です。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
13
CloudKitの機能を組み込む手順
アプリケーション間でコンテナを共有する
コンテナIDは、iCloud.com.example.gkumar1.SharedGalleryのように、「iCloud.」で始ま
り、その後に逆DNS形式の文字列が続きます。
4.
「OK」をクリックします。
Xcodeにより、Xcodeプロジェクトのエンタイトルメントファイルとメンバーセンターに新規のコ
ンテナIDが追加されます。
新しいコンテナIDを他のアプリケーションと共有したい場合は、当該アプリケーションの側に、共有
の対象として追加してください(“既存のコンテナを共有の対象として追加する” (12 ページ)を参
照)。
ここまでの結果を確認する
チームで管理しているコンテナのIDはすべて、「iCloud」設定画面やMember Centerで確認できます。
Member Centerでは、コンテナを追加する、名前を編集する、といった操作も可能です。
Member CenterでコンテナIDを確認するには
1.
メンバーセンターで「Certificates, Identifiers & Profiles」を選択してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
14
CloudKitの機能を組み込む手順
開発用にiCloudアカウントを生成する
2.
「Identifiers」以下の「iCloud Containers」を選択します。
開発用にiCloudアカウントを生成する
レコードをCloudKitコンテナに保存するためには、iCloudアカウントが必要です。アプリケーションを
実行するデバイス上で、このアカウントの証明書を入力することになります。iCloudアカウントがな
ければ、開発に必要なので、ここで生成してください。Mac上で「System Preferences」を起動し、
「iCloud」を押します。「Apple ID」テキストフィールドの下にある「Create Apple ID」を押した後、
画面に表示される指示に従って進めてください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
15
CloudKitの機能を組み込む手順
まとめ
まとめ
この章では次の事項を解説しました。
●
XcodeプロジェクトでCloudKitを有効にし、アプリケーションのデフォルトコンテナを生成する手
順。
●
CloudKit Dashboardにアクセスし、コンテナのスキーマやレコードを表示する手順。
●
開発に用いるiCloudアカウントを生成する方法。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
16
データベーススキーマの作成(レコード保存
による方法)
開発の際、CloudKit APIを活用すれば、容易にスキーマを作成できます。レコードオブジェクトをデー
タベースに保存するだけで、対応するレコード型とそのフィールドが自動的に生成されるのです。こ
の仕組みを「実行時(JIT、Just-In-Time)」スキーマといい、開発環境(ストアを通して販売されたア
プリケーションからはアクセス不可)で作業しているときに限って利用できます。たとえば、プロパ
ティリストに格納しておいたテストレコードを、CloudKitデータベースに追加する、といったことが
可能です。
この章ではCloudKit APIをいくつか紹介し、コード例を示します。CloudKitのクラスやメソッドを使う
実装ファイルは、先頭に「#import <CloudKit/CloudKit.h>」という行を追加する必要がありま
す。CloudKit APIの詳細については『Cloud Kit Framework Reference 』を参照してください。
スキーマの設計について
CloudKitスキーマの設計は、アプリケーションのオブジェクトモデルのうち、永続的に保存したい部
分が対象です。アプリケーションを一から実装するのであれば、Model-View-Controllerデザインパター
ンにもとづき、ユーザインターフェイスビューとモデルオブジェクトを分離してください。次いで、
オブジェクトモデルのうちiCloudに保存したい部分について、効率よく保存できるようスキーマを設
計します。
データをレコード型に分離する
CloudKitのスキーマはいくつかのレコード型から成り、レコード型には、名前、フィールド、その他
のメタデータがあります。フィールド型はプロパティリストの型に似ていますが、いくつか追加の型
があります。レコードとは別個に保存する大容量データについては専用のAsset型、地理的座標を効
率よく問い合わせる目的にはLocation型、レコード間の関係(1対1、1対多)を表現するためには
Reference型を使います。レコードの最大長は1MBなので、これよりも大容量のデータについては
(Bytes型ではなく)Asset型を利用してください。
使用可能なフィールド型、およびそれと同等のクラスを表に示します。
フィールド型
クラス
Description
Asset
CKAsset
大容量ファイルをレコードに関連づけて別個に保存
Bytes
NSData
バイトバッファをレコードに保存するためのラッパー
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
17
データベーススキーマの作成(レコード保存による方法)
スキーマの設計について
フィールド型
クラス
Description
Date/Time
NSDate
時間軸上のある一時点
Double
NSNumber
倍精度浮動小数点数
Int(64)
NSNumber
整数
Location
CLLocation
地理的座標(経緯度)および高度
Reference
CKReference
あるオブジェクトから別のオブジェクトを参照する関係
String
NSString
書き換え不可のテキスト文字列
List
NSArray
上記いずれかのフィールド型の配列
こういったフィールドを組み合わせて、データを永続的に保存するレコード型を設計します。たとえ
ば次のスケッチのような「Master-Detail」型ユーザインターフェイスでは、一連のアートワークの題
名を「Master」インターフェイス(左側の欄)に列挙し、選択されたアートワークのプロパティを
「Detail」インターフェイス(右側の領域)に表示します。これを表現するオブジェクトモデルは、
ArtworkおよびArtistというクラスから成ります。Artworkには、いずれかひとつのArtistを指す
「関係」があります。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
18
データベーススキーマの作成(レコード保存による方法)
レコードを生成する
このオブジェクトモデルに属するオブジェクトと、ArtworkやArtistといったレコード型には、1対
1の対応があります。Artworkレコード型のartistフィールドはReference型で、Artistのレコードを
指します。imageフィールドはURLを収容するAsset型、locationフィールドはLocation型で、緯度
および経度のプロパティを保存するようになっています。ArtworkやArtistの他のフィールドは、単
純なString型やDate型です。
レコードに与える名前を決める
ここで、各レコードに一意的な名前を与える方法を決めます。レコードゾーン(データベース内の区
画)と結合したレコード名とは、データベース内のレコードの場所を表すレコードIDのことです。他
のデータ源で使われている外部キーであっても、レコードゾーン内で一意になるよう、文字列を適切
に組み合わせたものでも構いません。たとえばArtworkレコードのレコード名としては、カタログ番
号、アーティストの名前、および姓を組み合わせた、「115 Chen, Mei」のような文字列が考えられ
ます。CloudKit Dashboardでレコードを生成すれば、一意的なIDが自動的に割り当てられます。
レコードを生成する
まず、レコード名とレコードゾーンを指定して、レコードID(CKRecordIDクラスのインスタンス)
を生成します。次いで、このレコードIDを指定して、レコード(CKRecordクラスのインスタンス)
を生成します。フィールドの設定は、キー値コーディングスタイルのメソッドを使っておこないま
す。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
19
データベーススキーマの作成(レコード保存による方法)
レコードを保存する
レコードを生成するには
1.
一意的なレコード名を指定して、レコードIDを生成します。
CKRecordID *artworkRecordID = [[CKRecordID alloc]
initWithRecordName:@"115"];
2.
レコードオブジェクトを生成します。
CKRecord *artworkRecord = [[CKRecord alloc] initWithRecordType:@"Artwork"
recordID:artworkRecordID];
3.
レコードのフィールドを設定します。
artworkRecord[@"title" ] = @"MacKerricher State Park";
artworkRecord[@"artist"] = @"Mei Chen";
artworkRecord[@"address"] = @"Fort Bragg, CA";
レコードを保存する
まず、レコードの保存先であるデータベース(公開、非公開、カスタムのいずれか)を選択した上
で、実際にレコードを保存します。該当するレコード型がなければ自動的に生成されます。
レコードを保存するには
1.
アプリケーションのデフォルトコンテナに属するデータベースを取得します。
公開データベースの場合:
CKContainer *myContainer = [CKContainer defaultContainer];
CKDatabase *publicDatabase = [myContainer publicCloudDatabase];
非公開データベースの場合:
CKContainer *myContainer = [CKContainer defaultContainer];
CKDatabase *privateDatabase = [myContainer privateCloudDatabase];
カスタムデータベースの場合:
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
20
データベーススキーマの作成(レコード保存による方法)
iCloud証明書を入力する(アプリケーション実行前の操作)
CKContainer *myContainer = [CKContainer
containerWithIdentifier:@"iCloud.com.example.ajohnson.GalleryShared"];
カスタムコンテナを生成し、複数のアプリケーションで共有する場合は、『“アプリケーション間
でコンテナを共有する” (11 ページ)』を参照してください。
2.
レコードを保存します。
[publicDatabase saveRecord:artworkRecord completionHandler:^(CKRecord
*artworkRecord, NSError *error){
if (!error) {
// Insert successfully saved record code
}
else {
// Insert error handling
}
}];
該当するレコード型がなければ、指定されたフィールドにもとづき、CloudKitフレームワークが
自動的に生成します。
Xcodeの「Run」ボタンを押す前に、デバイスにiCloud証明書を入力してください(次の節を参照)。
iCloud証明書を入力する(アプリケーション実行前の操作)
実稼働環境のデフォルトの権限設定によれば、認証されていないユーザは、公開データベースを読み
取れますが、書き込みはできません。したがって、アプリケーションを実行し、データベースにレ
コードを保存するためには、iOSならば「Settings」、Macならば「System Preferences」で、iCloudアカ
ウントを入力する必要があります。さらにiCloud Driveも有効にします。この後の説明で、iCloud証明
書が必要な場合にダイアログを表示する、エラー処理ルーチンを実装します(“iCloud証明書を入力す
るようユーザに警告する” (23 ページ)を参照)。
開発中、Xcodeを介し、iOSシミュレータやiOSデバイス上でアプリケーションを実行する際にも、公
開データベース内のレコードを読み込めるよう、iCloud証明書を入力する必要があります。
iOSシミュレータ上でアプリケーションを実行するためには、iOSシミュレータ側にiCloud証明書を入
力した上で、Xcode上で当該シミュレータを選択し、「Run」ボタンを押すことになります。この操作
を、Xcodeの「Scheme」ポップアップメニューで選択した、iOSシミュレータそれぞれについて実行
してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
21
データベーススキーマの作成(レコード保存による方法)
iCloud証明書を入力する(アプリケーション実行前の操作)
iCloud証明書をiOSシミュレータに入力するには
1.
「Xcode」>「Open Developer Tool」>「iOS Simulator」コマンドを実行します。
2.
iOSシミュレータで、「Hardware」>「Home」を選択します。
3.
「Settings」アプリケーションを起動し、「iCloud」を押します。
4.
Apple IDとパスワードを入力してください。
5.
「サインイン」をクリックします。
iOSがiCloudアカウントを確認するまで、多少時間がかかります。
6.
iCloud Driveを有効にするため、「iCloud Drive」スイッチを押してください。
スイッチが現れていなければ、既にiCloud Driveは有効になっています。
iCloudアカウントを生成する手順については、“開発用にiCloudアカウントを生成する” (15 ページ)
を参照してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
22
データベーススキーマの作成(レコード保存による方法)
iCloud証明書を入力するようユーザに警告する
iCloud証明書を入力するようユーザに警告する
レコードを保存する前に、ユーザがiCloudアカウントにサインインしているか確認してください。ま
だであれば警告画面を表示して、iCloud証明書を入力し、iCloud Driveを有効にする手順を示さなけれ
ばなりません。
[[CKContainer defaultContainer] accountStatusWithCompletionHandler:^(CKAccountStatus
accountStatus, NSError *error) {
if (accountStatus == CKAccountStatusNoAccount) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Sign
in to iCloud"
message:@"Sign
in to your iCloud account to write records. On the Home screen, launch Settings,
tap iCloud, and enter your Apple ID. Turn iCloud Drive on. If you don't have an
iCloud account, tap Create a new Apple ID."
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Okay"
style:UIAlertActionStyleCancel
handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}
else {
// Insert your just-in-time schema code here
}
}];
レコードを保存する際に発生しうるエラーについては、『CloudKit Framework Constants Reference 』を
参照してください。
アプリケーションを実行する
Xcode上でアプリケーションを起動すると、データベースにレコードを保存し、スキーマを生成する
コードが実行されます。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
23
データベーススキーマの作成(レコード保存による方法)
ここまでの結果を確認する
ここまでの結果を確認する
CloudKit Dashboardを使って、レコード型がスキーマに追加されていること、レコードがデータベー
スに追加されていることを確認してください。
CloudKit Dashboardにレコード型を表示する
レコード型に対して、適切なフィールド名/型が設定されているか確認します。
レコード型を表示するには
1.
CloudKit Dashboardにサインインします。
2.
左上のポップアップメニューから、アプリケーションが使っているコンテナを選択します。
CloudKitを使うアプリケーションがひとつだけであれば、ポップアップメニューの代わりに、そ
のデフォルトコンテナの名前が現れています。
Warning: CloudKit DashboardにすぐにコンテナIDが表示されない場合、いったんサインア
ウトし、サインインし直してみてください。CloudKitを有効にしたばかりであれば、コン
テナが生成され、画面に現れるまでに、多少時間がかかることがあります。
3.
左側列の「Record Types」を押してください。
すると追加されたレコード型が第2列に現れます。
4.
第2列からいずれかのレコード型を選択してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
24
データベーススキーマの作成(レコード保存による方法)
ここまでの結果を確認する
フィールド名と型が、右側の詳細領域に現れます。
「Users」というレコード型が現れていますが、これはシステムが予約しているものであり、削
除できません。フィールドの追加は可能です。
メタデータIDインデックスを有効にする
実行時(JIT)スキーマを使って生成したレコード型については、当初、メタデータインデックスが無
効になっています。これに対応するレコードをCloudKit Dashboardに表示するためには、レコードIDク
エリインデックスを有効にする必要があります。
レコードIDクエリインデックスを有効にするには
1.
左側列の「Record Types」を押し、レコード型を選択します。
2.
「Metadata Indexes」の展開表示用三角形をクリックしてください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
25
データベーススキーマの作成(レコード保存による方法)
ここまでの結果を確認する
3.
「ID」行の「Query」ボックスをオンにし、「Save」を押します。
CloudKit Dashboardにレコードを表示する
保存したレコードに、データがすべて揃っていることを確認します。
レコードを表示するには
1.
CloudKit Dashboardの左側列で、「Public Data」以下または「Private Data」以下の「Default Zone」
を押してください。
すると第2列にレコードが現れます(カスタムゾーンを使っていなければ、レコードは公開デフォ
ルトゾーンに格納されます)。
2.
第2列に並んでいる中から、いずれかのレコードをクリックしてください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
26
データベーススキーマの作成(レコード保存による方法)
まとめ
レコードのキーと値の組が、右側の詳細領域に現れます。
まとめ
この章では次の事項を解説しました。
●
スキーマを生成する手順(レコードをプログラムで保存する方法)
●
複数のアプリケーション間でコンテナIDを共有する方法
●
CloudKit Dashboardに、生成したレコード型やレコードを表示する手順
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
27
CloudKit Dashboardによるデータベース管理
データベース管理作業の多くはCloudKit Dashboardで実行できます。たとえばスキーマやレコードの
変更が可能です。コンテナのデータベースは、開発環境、実稼働環境の両方に存在します。どちらの
環境かによって、実行できる操作は異なります。
CloudKit Dashboardに接続してサインインした後、左側列の項目をクリックして、各種の機能に切り
替えるようになっています。
開発環境と実稼働環境について
開発環境では、スキーマを生成し、レコードを追加してテストを実施します。一方、実稼働環境に
は、App StoreやMac App Storeを通して販売されたアプリケーションがアクセスします。開発中のアプ
リケーションはどちらの環境にもアクセス可能です。しかし、Storeを通して販売されたアプリケー
ションは、実稼働環境にしかアクセスできません。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
28
CloudKit Dashboardによるデータベース管理
コンテナを選択する
開発環境の場合、CloudKitは自動的に、データベースに保存されたレコードにもとづきスキーマを生
成します。わざわざ手間をかけることなく、随時スキーマを改善していくことができます。また、
CloudKit Dashboard上でスキーマを変更し、レコードを追加することも可能です。
スキーマを配備する初回は、スキーマをそのまま実稼働環境にコピーします(レコードはコピー対象
外)。2回目以降は既存のスキーマにマージします。このときに衝突が発生しないよう、実稼働環境
に配備済みのスキーマについて、開発環境の側でフィールドやレコード型を削除することはできない
ようになっています。
実稼働環境でスキーマを変更することはできません。一方、公開データベースにレコードを追加し、
既存のレコードを変更、削除することは可能です。
Xcodeを介してCloudKitアプリケーションを起動すれば、自動的に開発環境で実行することになりま
す。アプリケーションをテスト用にXcodeからエクスポートする際には、どちらの環境で実行するか
指定できます。Storeに登録するときには、実稼働環境で実行する設定になります。
コンテナを選択する
CloudKit Dashboardではあらゆる機能を、あらかじめ選択したコンテナに適用するようになっていま
す。切り替えは左上隅のポップアップメニューでおこないます。このメニューには、所属する全Apple
Developer Programチームにわたるコンテナが、すべて列挙されています。開発中のアプリケーション
が用いるコンテナを選択した上で、以下に説明する作業を実施するようにしてください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
29
CloudKit Dashboardによるデータベース管理
開発環境をリセットする
開発環境をリセットする
「実行時(JIT)」スキーマの仕組みを有効にした状態で、レコードをデータベースに追加している場
合(“データベーススキーマの作成(レコード保存による方法)” (17 ページ)を参照)、アプリケー
ションを実行する都度、開発環境をリセットできます。開発環境を配備したことがなければ、リセッ
トすると、レコードやレコード型がすべて消えてしまいます。そうでなければ、いったんレコードを
すべて削除した後、スキーマを実稼働環境と同じ状態に復元するようになっています。
開発環境をリセットするには
1.
CloudKit Dashboardの左側列にある「Deployment」を押します。
2.
「Reset Development Environment」を押してください。
3.
するとダイアログが現れます。警告をよく読んだ上でチェックボックスをオンにし、「Reset &
Delete Data」を押してください。
レコード型を生成、削除する
開発環境では、CloudKit Dashboardを使ってレコード型を生成、変更、削除できます。
レコード型を生成するには
1.
CloudKit Dashboardで、「Schema」以下の「Record Types」を押してください。
当該スキーマのレコード型が、第2列に表示されます。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
30
CloudKit Dashboardによるデータベース管理
レコード型を生成、削除する
2.
詳細領域の左上隅にある「Add」ボタン(「+」の表示)を押してください。
3.
「New Record Type」フィールドに名前を入力します。
4.
フィールド名を入力し、ポップアップメニューからフィールド型を選択してください。
5.
フィールドを追加する場合は、「Add Field」を押し、フィールド名を入力し、ポップアップメ
ニューからフィールド型を選択します。
6.
削除したいフィールドがあれば、その行の「Delete」ボタン(「×」の表示)を押してください。
このボタンは、当該行にマースカーソルを持っていくと現れます。ただし、配備済みのフィール
ドであれば、ボタンは押せません。
7.
「保存(Save)」をクリックします。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
31
CloudKit Dashboardによるデータベース管理
レコードを追加、変更、削除する
レコード型を削除できるのは、まだ実稼働環境に配備していない、開発環境の側で追加したものに限
ります。削除すると、当該レコード型のレコードも、すべてデータベースから消えてしまいます。
レコード型を削除するには
1.
CloudKit Dashboardで、「Schema」以下の「Record Types」を押してください。
当該スキーマのレコード型が、第2列に表示されます。
2.
削除するレコード型を選択してください。
3.
詳細領域の左上隅にある「ごみ箱」アイコンを押してください。
レコード型が配備済みであれば、このアイコンは押せません。
4.
表示される確認ダイアログで「削除」をクリックします。
レコードを追加、変更、削除する
開発環境、実稼働環境とも、CloudKit Dashboardを使って、公開データベースにレコードを追加し、
あるいは既存のレコードを変更、削除できます。
レコードを生成するには
1.
CloudKit Dashboardで、「Public Data」以下または「Private Data」以下のゾーンを押してくださ
い。
たとえば公開データベースには「Default Zone」というゾーンがあります(「User Records」ゾー
ンには、CloudKitが自動生成したUsers型のレコードがあります)。
2.
第2列の左上隅にあるポップアップメニューから、レコード型を選択します。
3.
詳細領域の「Add」ボタン(「+」の表示)を押してください。
CloudKit Dashboardは自動的に、ランダムなUUIDをレコードIDとして割り当てます。
4.
テキストフィールドに値を入力してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
32
CloudKit Dashboardによるデータベース管理
レコードを追加、変更、削除する
5.
Date/Time型の場合は、暦日および時刻の値を、それぞれのフィールドに入力します。
6.
Location型であれば緯度と経度をそれぞれ入力します。
緯度は-90~90°、経度は-180~180°の範囲です。
7.
Assetの値については、ファイルをボックスまでドラッグするか、「Or Choose File」を押し、ファ
イルをアップロードしてください。
8.
「保存(Save)」をクリックします。
レコードを表示、変更、削除するには
1.
CloudKit Dashboardで、「Public Data」以下または「Private Data」以下のゾーンを押してくださ
い。
2.
第2列のポップアップメニューからレコード型を選択します。
3.
表示、編集、削除したいレコードを選択してください。
詳細領域にレコードフィールドが表示されます。
4.
レコードを編集する場合は、新しい値をテキストフィールドに入力し、「Save」を押します。
5.
削除したい場合は、詳細領域の左上隅にある「ごみ箱」アイコンを押してください。ダイアログ
が現れるので「Delete」ボタンを押します。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
33
CloudKit Dashboardによるデータベース管理
レコードを検索する
レコードを検索する
開発環境、実稼働環境とも、文字列フィールドが属するレコードは検索が可能です。
レコードを検索するには
1.
CloudKit Dashboardの左側列で、「Public Data」以下または「Private Data」以下の「Default Zone」
を押してください。
すると第2列にレコードが現れます
2.
第2列の「検索」アイコンを押してください。
検索フィールドが表示されます。
3.
検索フィールドにテキストを入力します。
CloudKit Dashboardはレコードを、フィールド値によって整列して表示します。検索可能なフィー
ルドがないレコード型の場合、「… doesn’t have a searchable field.」という表示が検索フィールド
の下に現れます。
レコードを整列する
開発環境、実稼働環境とも、フィールドの値にもとづきレコードを整列できます。
レコードを整列するには
1.
CloudKit Dashboardの左側列で、「Public Data」以下または「Private Data」以下の「Default Zone」
を押してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
34
CloudKit Dashboardによるデータベース管理
まとめ
すると第2列にレコードが現れます
2.
第2列に並んでいる中から、いずれかのレコードをクリックしてください。
3.
「Sort by address」ポップアップメニューからフィールドを選択してください。
CloudKit Dashboardはレコードを、フィールド値によって整列して表示します。
まとめ
この章では、CloudKit Dashboardによるデータベース管理を紹介し、次の事項を解説しました。
●
開発環境を既知の状態にリセットする方法
●
レコード型を生成、削除する手順
●
レコードを生成、編集する手順
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
35
レコードの取得
データベースに保存したレコードは、さまざまな機構を駆使して検索できます。レコードIDにもとづ
き個々のレコードを取得するほか、述語を用いて、条件に合致する多くのレコードを一括して取得す
ることも可能です(述語とは論理的な条件を定義したもののことで、レコードの検索に使用)。典型
的な使い方として、起動時にレコードの一部を取得して表示した後、ユーザの興味を惹くような変更
があれば通知するよう登録する、という方式が考えられます。
Locationフィールド型を使えば、ある地理的範囲に属するレコードを取得することも可能です(“場
所を基準にレコードを取得する” (43 ページ)を参照)。
IDにもとづきレコードを取得する
取得しようとするレコードのIDが既知であれば、これを指定して取得できます。例として、「115」
という名前のレコードを取得するコードを示します。
CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
CKRecordID *artworkRecordID = [[CKRecordID alloc] initWithRecordName:@"115"];
[publicDatabase fetchRecordWithID:artworkRecordID completionHandler:^(CKRecord
*artworkRecord, NSError *error) {
if (error) {
// Error handling for failed fetch from public database
}
else {
// Display the fetched record
}
}];
レコードを取得、変更する
個々のレコードを取得、変更した上で、その結果を保存することも可能です。Artworkレコードを取
得し、dateフィールドの値を変更した後、データベースに保存するコード例を示します。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
36
レコードの取得
述語を用いてレコードを検索する
// Fetch the record from the database
CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
CKRecordID *artworkRecordID = [[CKRecordID alloc] initWithRecordName:@"115"];
[publicDatabase fetchRecordWithID:artworkRecordID completionHandler:^(CKRecord
*artworkRecord, NSError *error) {
if (error) {
// Error handling for failed fetch from public database
}
else {
// Modify the record and save it to the database
NSDate *date = artworkRecord[@"date"];
artworkRecord[@"date"] = [date dateByAddingTimeInterval:30.0 * 60.0];
[publicDatabase saveRecord:artworkRecord completionHandler:^(CKRecord
*savedRecord, NSError *saveError) {
// Error handling for failed save to public database
}];
}
}];
述語を用いてレコードを検索する
大量のレコード、大容量のファイルがiCloudに格納されている場合、レコードすべてをローカルデバ
イスに持ってくるのは現実的でありません。代わりにクエリを用いて、一部のみを取得するとよいで
しょう。クエリは、レコード型、(インデックスを設定したフィールドを対象とする)述語、整列記
述子を組み合わせて作ります。クエリの構築は、CKQueryオブジェクトを用いたコードでおこないま
す。
例として、所定の見出しのアートワークをすべて取得するコードを示します。
CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title = %@", @"Santa
Cruz Mountains"];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Artwork" predicate:predicate];
[publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray
*results, NSError *error) {
if (error) {
// Error handling for failed fetch from public database
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
37
レコードの取得
まとめ
}
else {
// Display the fetched records
}
}];
Galleryアプリケーションには、見出しを指定してアートワークを取得する機能があります。
まとめ
この章では次の事項を解説しました。
●
IDにもとづきレコードを取得する方法
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
38
レコードの取得
まとめ
●
個々のレコードを取得、変更、保存する手順
●
クエリや述語を用いて複数のレコードを一括取得する方法
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
39
AssetフィールドやLocationフィールドの使い方
CloudKitには、大容量データファイルの格納用に特化したフィールド型、地理的座標を基準にレコー
ドを取得するためのフィールド型があります。該当するデータを扱う場合、性能改善の面でも効果が
あります。地理的座標を表すフィールド型を利用して、地図上のある区域にレコードを表示する、と
いう使い方が考えられます。
大容量ファイルをCloudKitに格納する
Assetフィールド型を使って、大容量データファイルをCloudKitに格納できます。アセットは、関連
づけられたレコードが所有するものとして扱います。ガベージコレクションの機能もCloudKitに組み
込まれています。さらに、アセットを効率よくアップロード、ダウンロードする機能もあります。
次のコード例では、Assetフィールド型をCKAssetオブジェクトで表しています。Artworkレコード
のAssetフィールドに、リソースファイルを設定するコードです。
// Create a URL to the local file
NSURL *resourceURL = [NSURL fileURLWithPath:@"…"];
if (resourceURL){
CKAsset *asset = [[CKAsset alloc] initWithFileURL:resourceURL];
artworkRecord[@"image"] = asset;
}
レコードを保存すると、自動的にファイルがiCloudにアップロードされます。
Assetフィールドを含むレコード型を保存するコードの実装は、この例のような書き方になります。
レコードを保存する手順は“レコードを保存する” (20 ページ)で説明しています。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
40
AssetフィールドやLocationフィールドの使い方
Locationフィールドを追加する
ここまでの結果を確認する
スキーマやレコードに施した変更内容がiCloudに反映されているかどうか、確認する手順については、
“CloudKit Dashboardにレコード型を表示する” (24 ページ)および“CloudKit Dashboardにレコードを
表示する” (26 ページ)で説明しました。Assetオブジェクトが収容されたレコードをCloudKit
Dashboardに表示すると、値の代わりに、バイナリデータとしてのデータ長が表示されます。このデー
タをダウンロードし、あるいはレコードから削除することも可能です。
Locationフィールドを追加する
住所その他、地理的な場所を表すデータをレコードに収容する場合、CLLocationオブジェクトとし
て保存すれば、場所を基準に当該レコードを取得できるようになります。たとえば、レコードが表す
場所を、地図上にピンで表示するアプリケーションが考えられます。
CLGeocoderクラスを使って、住所を表す文字列を「場所」オブジェクトに変換し、レコードに格納
するコード例を示します。
CLGeocoder *geocoder = [CLGeocoder new];
[geocoder geocodeAddressString:artwork[kArtworkAddressKey]
completionHandler:^(NSArray *placemark, NSError *error){
if (!error) {
if (placemark.count > 0){
CLPlacemark *placement = placemark[0];
artworkRecord[kArtworkLocationKey] = placement.location;
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
41
AssetフィールドやLocationフィールドの使い方
Locationフィールドを追加する
}
}
else {
// insert error handling here
}
// Save the record to the database
}];
Locationフィールドを含むレコード型を保存するコードの実装は、この例のような書き方になりま
す。レコードを保存する手順は“レコードを保存する” (20 ページ)で説明しています。
ここまでの結果を確認する
レコードをCloudKit Dashboardに表示すると、実際には緯度と経度が表示されます。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
42
AssetフィールドやLocationフィールドの使い方
場所を基準にレコードを取得する
場所を基準にレコードを取得する
場所データをデータベースに保存すると、レコード型、述語、整列記述子を組み合わせたクエリを用
い、場所を基準にレコードを取得できます。Locationフィールドを述語に指定してレコードを正常
に取得するためには、このフィールドにインデックスを設定しておかなければなりません。
サンフランシスコから100km以内の場所に当たるレコードを、すべて取得するコード例を示します。
// Get the public database object
CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
// Create a predicate to retrieve records within a radius of the user's location
CLLocation *fixedLocation = [[CLLocation alloc] initWithLatitude:37.7749300
longitude:-122.4194200];
CGFloat radius = 100000; // meters
NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"distanceToLocation:fromLocation:(location, %@) < %f",
fixedLocation, radius];
// Create a query using the predicate
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Artwork" predicate:predicate];
// Execute the query
[publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray
*results, NSError *error) {
if (error) {
// Error handling for failed fetch from public database
}
else {
// Display the fetched records
}
}];
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
43
AssetフィールドやLocationフィールドの使い方
まとめ
次のiOSアプリケーションは、特定の場所から指定した半径内にあるアートワークを取得するように
なっています。
場所データや地図について詳しくは、『LocationandMapsProgrammingGuide 』を参照してください。
まとめ
この章では次の事項を解説しました。
●
レコードにCKAssetフィールドを追加して保存することにより、レコード型にAsset型を追加す
る手順
●
CLLocationオブジェクトを使ってレコードにLocation型を追加する手順
●
場所を基準にオブジェクトを取得する方法
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
44
参照フィールドの追加
スキーマで参照フィールドを用いることにより、モデルオブジェクト間の関係(階層関係、所有関係
など)を表現できます。この章では、(1)レコードに参照フィールドを追加する手順、(2)参照
フィールドをたどってレコードを保存、取得する手順、(3)所有関係を指定することにより、ある
レコードを削除したとき、関連レコードも芋づる式に削除されるようにする方法を解説します。
スキーマにおける関係のモデル化について
参照フィールド型を使って、モデルオブジェクト間の関係(1対1、1対多)を表現できます。実装コー
ドでは、参照フィールドは参照先レコードのレコードIDをカプセル化したCKReferenceオブジェクト
であり、これを参照元レコードに追加することになります。スキーマで1対1の関係を表現する場合
は、参照元レコード型に参照フィールドを追加します。
一方、モデルオブジェクト間の1対多関係を表す場合、子レコードから親レコードを指す参照を用い
る方法が有効です。すなわち、子レコードの方に参照フィールドを追加するのです。このスキーマで
は、子レコードが参照元、親レコードが参照先です。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
45
参照フィールドの追加
スキーマにおける関係のモデル化について
たとえば、ArtistとArtworkの間には1対多の関係があり、さらに、ArtworkからArtistを指す(逆
向きの)1対1関係もあるとします。
この関係をスキーマで表現するため、対応するArtworkレコード型に、artistという参照フィールド
を追加します。この参照フィールドには、ArtistレコードのIDが収容されます。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
46
参照フィールドの追加
参照フィールドを生成する
同様に、オブジェクトモデルのArtistからCollectionを指す1対多の関係を表すため、参照フィー
ルドをCollectionレコードに追加します。該当するレコードを取得した後、モデルオブジェクト間
に、1対1および1対多の適切な関係を生成してください。
参照フィールドを生成する
開発中、参照フィールドを含むレコードを保存すると、スキーマが生成されます。1対1の関係は、
CKReferenceオブジェクトを参照元レコードに追加することによって表します。
あるレコードから別のレコードへの参照を生成するには
1.
参照先レコードのレコードIDを生成または取得します。
CKRecordID *artistRecordID = [[CKRecordID alloc] initWithRecordName:@"Mei
Chen"];
2.
このレコードIDを引数として渡し、参照オブジェクトを生成します。
CKReference *artistReference = [[CKReference alloc]
initWithRecordID:artistRecordID action:CKReferenceActionNone];
3.
参照オブジェクトを参照元レコードに追加します。
CKRecord *artworkRecord;
…
artworkRecord[@"artist"] = artistReference;
参照元レコードを保存するとレコード型が生成されます(“データベーススキーマの作成(レコード
保存による方法)” (17 ページ)を参照)。参照を含むレコードを複数保存したい場合は、すべて一
括して保存してください(“バッチ処理で複数のレコードを保存、取得する” (51 ページ)を参照)。
CloudKitは必ず、参照先レコードを参照元レコードより先に保存します。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
47
参照フィールドの追加
参照フィールドを生成する
ここまでの結果を確認する
CloudKit Dashboardにレコード型を表示して確認してください(“CloudKit Dashboardにレコード型を表
示する” (24 ページ)を参照)。参照フィールドは参照元レコード型の側に現れているはずです。た
とえばArtworkレコード型に、artistというReference型のフィールドがあります。
レコードを表示して確認してください(“CloudKit Dashboardにレコードを表示する” (26 ページ)を
参照)。参照先レコード名が、参照元レコードに表示されているはずです。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
48
参照フィールドの追加
参照フィールドをたどってレコードを取得する
参照フィールドをたどってレコードを取得する
レコード(CKRecordオブジェクト)を、Model-View-Controllerデザインパターンでいうモデルオブジェ
クトとして扱ってはなりません。代わりに、取得したレコードをもとに、別途モデルオブジェクトを
生成します。取得したレコードに参照が含まれる場合は、特にこれが重要です。レコード間の参照に
どのような意味合いがあるか解釈し、モデルオブジェクト間に適切な関係を生成するのは、個々のア
プリケーションの責任です。参照元レコードを取得したとき、自動的に参照先レコードも取得される
ということはありません。必要に応じて参照先レコードを取得するのはアプリケーション側の責任で
す。参照先や参照元のレコードを取得する方法は、参照がどのような関係を表すか、によって異なり
ます。
可能ならばバッチ方式で取得し、モデルオブジェクト間の関係を解決してください(“バッチ処理で
複数のレコードを保存、取得する” (51 ページ)を参照)。
1対1の関係を解決する
1対1の関係については、参照元レコードの参照フィールドを取得した上で、対応する参照先レコード
を取得することになります。
1対1の関係の参照先を取得するには
1.
参照フィールドを取得します。
CKRecord *artworkRecord;
…
CKReference *referenceToArtist = artworkRecord[@"artist"];
2.
参照から参照先レコードIDを取得します。
CKRecordID *artistRecordID = artistReference.recordID;
3.
参照先レコードを取得します。
[publicDatabase fetchRecordWithID:artistRecordID
completionHandler:^(CKRecord *artistRecord, NSError *error) {
if (error) {
// Failed to fetch record
}
else {
// Successfully fetched record
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
49
参照フィールドの追加
参照フィールドをたどってレコードを取得する
}
}];
関係を解決するコードは、fetchRecordWithID:completionHandler:の引数として渡す完了ハ
ンドラに記述してください。たとえば、対応するArtworkオブジェクトとArtistオブジェクトの
間に、1対1の関係を生成するコードです。
1対多の関係を解決する
1対多の関係については、親レコードの子をすべて、述語を用いて一括取得します。親を参照先レコー
ドとして持つレコードを、一括して取得できます。
1対多関係の子を取得するには
1.
出発点となるのは、あらかじめ取得済みの親レコードID(CKRecordID)、および親のモデルオブ
ジェクトです。
たとえば、Artistモデルオブジェクトを、Artistレコードから生成しておきます。
__block Artist *artist = [[Artist alloc] initWithRecord:artistRecord];
完了ハンドラから親オブジェクトにアクセスできるよう、__blockを指定してください。
2.
子レコードを取得するための述語オブジェクトを生成します。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"artist = %@",
artistRecordID];
実際のコードでは、artistの部分を子レコードの参照フィールド名、artistRecordIDの部分を
親レコードIDに置き換えてください。
注意: 述語の書式文字列引数の右辺値には、CKRecord、CKRecordID、CKReferenceの
各オブジェクトを記述できます。
3.
検索するレコード型を指定する、クエリオブジェクトを生成します。
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Artwork"
predicate:predicate];
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
50
参照フィールドの追加
バッチ処理で複数のレコードを保存、取得する
実際のコードでは、@"Artwork"を子レコード型の名前に置き換えてください。
4.
取得処理を実行します。
CKDatabase *publicDatabase = [[CKContainer defaultContainer]
publicCloudDatabase];
[publicDatabase performQuery:query inZoneWithID:nil
completionHandler:^(NSArray *results, NSError *error) {
if (error) {
// Failed to fetch children of parent
}
else {
// Create model objects for each child and set the one-to-many
relationship from the parent to its children
}
}];
else文の側には、モデルオブジェクト間に適切な関係を生成するコードを追加してください。
バッチ処理で複数のレコードを保存、取得する
複数のレコードを保存、取得する場合、バッチ処理で一括して実行すればより効率的です。参照フィー
ルドを含むレコード型の場合、特にこれが重要です。CKModifyRecordsOperationオブジェクトを使
うと、1回の操作で参照元および参照先のレコードを保存できます。IDがない参照先レコードへの参
照を生成することも可能です。参照元と参照先のレコードをどちらも保存する場合、CloudKitは関係
するCKRecordオブジェクトのグラフにおいて、参照先を必ず参照元よりも先に保存します。また、
CKFetchRecordsOperationオブジェクトを使うと、多くのレコードの参照先レコードをすべて、1回
の操作で取得できます。
複数のレコードを一括取得するには
1.
取得しようとするレコードのレコードIDをすべて、配列に追加します。
たとえば1対1の関係が複数ある場合、その参照フィールドの参照先レコードIDをすべて、配列に
追加することになります。
2.
この配列を引数として渡し、「レコード取得」操作オブジェクトを生成します。
CKFetchRecordsOperation *fetchRecordsOperation = [[CKFetchRecordsOperation
alloc] initWithRecordIDs:fetchRecordIDs];
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
51
参照フィールドの追加
バッチ処理で複数のレコードを保存、取得する
3.
取得したレコードごとに呼び出される、完了ハンドラを渡すことも可能です。
正常に取得できた各レコードについて、そのデータを保存したい場合は、必要な処理をおこなう
完了ハンドラを用意してください。完了ハンドラは、取得したレコードに対応するモデルオブ
ジェクトを生成するとともに、取得できなかった場合に備え、そのレコードIDを保存しておかな
ければなりません。
fetchRecordsOperation.perRecordCompletionBlock = ^(CKRecord *record,
CKRecordID *recordID, NSError *error) {
if (error) {
// Retain the record IDs for failed fetches
}
else {
// Create a model object and set any relationships to other models
}
};
4.
完了ハンドラをオペレーション全体に設定します。
fetchRecordsOperation.fetchRecordsCompletionBlock = ^(NSDictionary
*recordsByRecordID, NSError *error) {
if (error) {
// Failed to fetch all or some of the records
}
else {
// Update all associated views
}
};
手順3で用意した完了ハンドラで、レコードIDを保存するようにしていれば、後で改めて取得を試
みることも可能です。
5.
オペレーションを起動します。
fetchRecordsOperation.database = [[CKContainer defaultContainer]
publicCloudDatabase];
[fetchRecordsOperation start];
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
52
参照フィールドの追加
所有関係を指定することにより、関連するレコードを自動的に削除する
所有関係を指定することにより、関連するレコードを自動的
に削除する
参照先レコードを削除する際、参照元レコードも削除するよう指定することができます。たとえば親
を削除したとき、1対多関係で結ばれた子もすべて削除する、といったことが考えられます。この場
合、親レコードIDは子レコードを所有している ことになります。子がさらに他のレコードを所有して
いれば、それも「芋づる式に」削除されます。
削除アクションは参照オブジェクトを生成する際に指定します。参照先を削除する際に参照元も削除
したければ、参照先レコードとCKReferenceActionDeleteSelfを、アクション引数として
initWithRecord:action:メソッドに渡してください。Galleryの例では、アーティストを削除したと
き、これに属するアートワークも削除されるよう指定しています。
CKReference *referenceToArtist = [[CKReference alloc] initWithRecord:artistRecord
action:CKReferenceActionDeleteSelf];
artworkRecord[@"artist"] = referenceToArtist;
CloudKit Dashboard上で、各レコードについてDeleteSelfボックスをオンにする、という方法もありま
す。
CKReferenceActionDeleteSelf参照の、第1の参照先レコードを削除すると、CloudKitが参照元レ
コードを削除します。参照元レコードにCKReferenceActionDeleteSelf参照が複数ある場合、他の
参照先レコードが残っていても削除されてしまい、データモデルの整合性が崩れる可能性がありま
す。したがって、どのレコードもCKReferenceActionDeleteSelf参照は高々1つであるように、ス
キーマを設計してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
53
レコードに対する変更を通知するよう登録
レコードに変更が起こっていないか定期的に問い合わせ、ほとんどは前回と同じであることを確かめ
ているに過ぎない、という状況は、効率的とは言えません。代わりに、レコードが変更されたら通知
するようサーバに登録し、あとはバックグラウンドでクエリを処理させるとよいでしょう。サーバ
は、レコードに所定の変更が施されれば、アプリケーションに通知します。たとえば、特定のアー
ティストのアートワークに関心があるユーザは、該当するアートワークがアップロードされたとき、
アプリケーションに通知が届くようにすることができます。
サブスクリプションをデータベースに保存する
レコード型、述語、通知を求める変更の種類を指定する、サブスクリプションオブジェクトを生成し
て、データベースに保存します。
サブスクリプションを生成、保存するには
1.
述語オブジェクトを生成します。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
54
レコードに対する変更を通知するよう登録
サブスクリプションをデータベースに保存する
たとえば、「特定のアーティストのアートワーク」という指定が考えられます(Artworkレコー
ド型のartistはReference型であると想定)。
CKRecordID *artistRecordID = [[CKRecordID alloc] initWithRecordName:@"Mei
Chen"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"artist = %@",
artistRecordID];
注意: 述語の書式文字列引数の右辺値には、CKRecord、CKRecordID、CKReferenceの
各オブジェクトを記述できます。レコード名が既知であれば、これだけを含むレコード
IDを生成してもよいでしょう。
2.
レコード型、述語、通知オプションを指定して、サブスクリプションを生成します。
CKSubscription *subscription = [[CKSubscription alloc]
initWithRecordType:@"Artwork"
predicate:predicate
options:CKSubscriptionOptionsFiresOnRecordCreation];
引数optionsには、CKSubscriptionOptionsFiresOnRecordCreation、
CKSubscriptionOptionsFiresOnRecordDeletion、
CKSubscriptionOptionsFiresOnRecordUpdate、CKSubscriptionOptionsFiresOnceを指定で
きます。引数optionsはビットマスクなので、変更の種類をいくつでも組み合わせて指定可能で
す。たとえばCKSubscriptionOptionsFiresOnRecordCreation |
CKSubscriptionOptionsFiresOnRecordUpdateをoptions:引数として指定すれば、新規データ
が現れる都度、すべて通知を受け取ることになります。
3.
CloudKit通知オブジェクトを生成します。
CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
notificationInfo.alertLocalizationKey = @"New artwork by your favorite
artist.";
notificationInfo.shouldBadge = YES;
ローカライズした文字列を画面に表示したい場合は、通知のalertLocalizationKeyプロパティ
に適切な値を指定してください(alertBodyプロパティではありません)。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
55
レコードに対する変更を通知するよう登録
サブスクリプションをデータベースに保存する
4.
サブスクリプションの通知オブジェクトとして、ここで生成した、CloudKitの通知オブジェクト
を設定します。
subscription.notificationInfo = notificationInfo;
5.
サブスクリプションをデータベースに保存します。
CKDatabase *publicDatabase = [[CKContainer defaultContainer]
publicCloudDatabase];
[publicDatabase saveSubscription:subscription
completionHandler:^(CKSubscription *subscription,
NSError *error) {
if (error)
// insert error handling
}
];
Xcode上でアプリケーションを実行すると、サブスクリプションがデータベースに保存されます。
ここまでの結果を確認する
サブスクリプションがスキーマに保存されたことを確認します。CloudKit Dashboardには、サブスク
リプションオブジェクトが、スキーマのサブスクリプション型として表示されます。
1.
CloudKit Dashboardの左上隅にあるポップアップメニューから、アプリケーションが使うコンテナ
を選択します。
2.
「Schema」以下の「Subscription Types」を押してください。
第2列にサブスクリプションが列挙されます。
3.
必要ならば、いずれかのサブスクリプションを選択してください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
56
レコードに対する変更を通知するよう登録
プッシュ通知を送るよう登録する
詳細領域にサブスクリプションのプロパティが現れます。
プッシュ通知を送るよう登録する
サブスクリプションをデータベースに保存しても、それだけで通知が届くようにはなりません。
CloudKitは“Apple Push Notificationサービス(Apple Push Notification service(APNs))” (72 ページ)
を使ってサブスクリプション通知をアプリケーションに送るようになっているので、プッシュ通知を
受け取れるよう登録する必要があるのです。
iOSアプリケーションであれば、次のようなコードをapplication:didFinishLaunchingWithOptions:
プロトコルメソッドに追加することにより、プッシュ通知が届くよう登録します。
// Register for push notifications
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings
settingsForTypes:UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:notificationSettings];
[application registerForRemoteNotifications];
Macアプリケーションの場合はapplicationDidFinishLaunching:プロトコルメソッドを実装して登
録します。
いずれの場合も、application:didRegisterForRemoteNotificationsWithDeviceToken:メソッ
ドやapplication:didFailToRegisterForRemoteNotificationsWithError:メソッドを実装する
ことにより、プッシュ通知を受け取る旨が正常に登録できた場合、あるいは失敗した場合に、適切な
アクションを実行できます。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
57
レコードに対する変更を通知するよう登録
プッシュ通知に対処するコードを記述する
注意: Member Centerで、アプリケーションの特定App IDに対し、プッシュ通知を有効にす
る必要はありません。CloudKitを有効にした時点で、Xcodeが自動的にAPNsエンタイトルメ
ントを、エンタイトルメントファイルに追加しています。
プッシュ通知に対処するコードを記述する
次にapplication:didReceiveRemoteNotification:メソッドを実装して、サブスクリプション通
知が届いたときに対処できるようにします。iOSアプリケーションならばUIApplicationDelegateプ
ロトコルメソッド、MacアプリケーションであればNSApplicationDelegate Protocolプロトコルメ
ソッドを実装してください。たとえば、所定の述語に合致するレコードが生成、更新、削除されたと
き、ビューを更新する、という処理が考えられます。
1.
application:didReceiveRemoteNotification:プロトコルメソッドを、アプリケーションのデ
リゲートに追加します。
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
}
2.
application:didReceiveRemoteNotification:メソッドではまず、引数userInfoを
CKNotificationオブジェクトに変換します。
CKNotification *cloudKitNotification = [CKNotification
notificationFromRemoteNotificationDictionary:userInfo];
3.
通知の本体を取得します。
NSString *alertBody = cloudKitNotification.alertBody;
4.
CKQueryNotificationオブジェクトから、追加または更新されたレコードを取得します。
if (cloudKitNotification.notificationType == CKNotificationTypeQuery) {
CKRecordID *recordID = [(CKQueryNotification *)cloudKitNotification
recordID];
}
5.
レコードの変更内容に応じて、ビューを更新し、あるいはユーザに通知します。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
58
レコードに対する変更を通知するよう登録
サブスクリプションをテストする
サブスクリプションをテストする
サブスクリプションのテストは、まず、Xcode上でアプリケーションを実行して実施します。この状
態で、CloudKit Dashboardを使ってレコードを生成、更新、削除し、通知が届くことを確認してくだ
さい(“レコードを追加、変更、削除する” (32 ページ)を参照)。続いて、複数のデバイス上でア
プリケーションを実行し、充分にサブスクリプションをテストしてください。あるデバイス上で変更
を施し、別のデバイスにサブスクリプション通知が届くかどうか確認するのです。通知の発信元と同
じデバイスに通知が届くことはないので、複数のデバイスが必要です。
iOSの場合、iOSシミュレータではテストできません。iOSデバイスを使ってください。通知を受け取る
許可を求めるダイアログが現れれば、プッシュ通知を正常に登録できたことになります。
まとめ
この章では次の事項を解説しました。
●
述語を使って、レコードに変更が施されたときに通知するよう登録する手順
●
サブスクリプション通知に対処する方法
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
59
CloudKitアプリケーションのテスト
CloudKitアプリケーションの実地テストは、同時に複数のユーザが関与し、いくつかのデバイス、さ
まざまなiCloudアカウントで実施します。iOS用、Mac用、どちらのアプリケーションも、Xcodeなし
で、所定のテストデバイス上でのみ起動するよう設定可能です。開発環境や実稼働環境における、当
初のテスト方法として推奨します。これが済んだ後、iTunes Connectにアップロードし、実稼働環境
でテストすることになります。iTunes Connectを使って、テスト担当者を内部(チーム内のiTunes
Connectユーザ)からも外部(電子メールアドレスのみ開示しているユーザ)からも募集し、テスト
に参加してもらいます。テスト担当者はTestFlightを使って、テスト対象アプリケーションをダウン
ロードします。
TestFlightでアプリケーションを配布する手順については、『App Distribution Guide 』の“Beta Testing
Your iOS App”を参照してください。
アドホックプロビジョニングを施したiOSアプリケーションを
配布する
アドホックプロビジョニングを施したアプリケーションは、Xcodeがなくても、テスト用iOSデバイス
上で実行できます。アドホックプロビジョニングプロファイルを使ってアプリケーションをエクス
ポートしますが、それに先立ち、テスト用デバイスをすべてMember Centerに登録してください。開
発用と同じデバイスプールを使うので、テスト用デバイスは1年あたり100台までとなります。多数の
テスト用デバイスを一括登録する手順については、“Registering Devices Using Member Center”を参照し
てください。
アドホックテスト用にアプリケーションをエクスポートする際、開発環境か実稼働環境かを選択しま
す。まだスキーマを実稼働環境に配備していなければ(“開発環境のスキーマを実稼働環境に配備す
る” (64 ページ)を参照)、開発環境を選択してください。
アドホックテスト用に、アプリケーションをアーカイブ化、エクスポートするには
1.
「Scheme」ツールバーからiOSデバイスを選択し、「Run」を押してください。
iOSシミュレータ用にビルドしたバイナリをアーカイブ化することはできません。
2.
「Product」>「Archive」コマンドを実行します。
「Archives」オーガナイザが開き、新しいアーカイブが表示されます。
3.
「Archives」オーガナイザで、該当するアーカイブを選択して「Export」をクリックします。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
60
CloudKitアプリケーションのテスト
アドホックプロビジョニングを施したiOSアプリケーションを配布する
4.
「Save for Ad Hoc Deployment」を選択し、「Next」ボタンを押します。
5.
表示されるダイアログで、ポップアップメニューからチームを選択して「Choose」をクリックし
ます。
必要に応じて、Xcodeで配布用証明書とアドホックプロビジョニングプロファイルが作成されま
す。
6.
続いて現れるダイアログのポップアップメニューからコンテナ環境を選択し、「Next」を押しま
す。
●
「Production」を選択すれば、実稼働環境のデータにアクセスすることになります。
●
「Development」を選択すれば開発環境です。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
61
CloudKitアプリケーションのテスト
チームプロビジョニングプロファイルを使ってMacアプリケーションを配布する
7.
表示されるダイアログで、アプリケーション、エンタイトルメント、プロビジョニングプロファ
イルを確認して「Export」をクリックします。
アドホックプロビジョニングプロファイルの名前は「XC Ad Hoc:」で始まります。
8.
iOS Appファイルの名前と出力先を入力して「Export」をクリックします。
ファイルの拡張子は「.ipa」となります。
この後、iOS Appファイルをテスト担当者に送ります。iTunesを使い、それぞれのiOSデバイス上にイ
ンストールする手順を説明してください(“Installing Your App on Test Devices”を参照)。
チームプロビジョニングプロファイルを使ってMacアプリケー
ションを配布する
Xcodeを使ってアプリケーションをエクスポートする前に、テスト用に使用するデバイスをすべてメ
ンバーセンターに登録しておきます。チームプロビジョニングプロファイルに複数のテスト用デバイ
スを追加する方法は、“Registering Devices Using Member Center”を参照してください。デバイスを追加
したら、Xcode上でプロファイルを更新して(「Xcode上でプロビジョニングプロファイルを更新す
る」を参照)、チームプロビジョニングプロファイルを再生成します。
チームプロビジョニングプロファイルを使ってコード署名を施したアプリケーションをエクスポート
するには
1.
「Scheme」ツールバーメニューからターゲットを選択して「Run」をクリックします。
2.
「Product」>「Archive」コマンドを実行します。
「Archives」オーガナイザが開き、新しいアーカイブが表示されます。
3.
「Archives」オーガナイザで、該当するアーカイブを選択して「Export」をクリックします。
4.
「Export as a Mac Application」をオンにします。
Xcodeはチームプロビジョニングプロファイルをバンドルに埋め込み、開発用証明書を使ってコー
ド署名を施します。
この後、アプリケーションをテスト担当者に配布し、所定のデバイス上で実行することになります。
これで、このアプリケーションはチームプロビジョニングプロファイルに指定されたデバイス上でし
か起動しなくなります。
アプリケーションの開発者の身許が分からないため、そのアプリケーションを所定のデバイス上で起
動できない場合は、OS Xのセキュリティ設定をバイパスして起動するようにします。
開発者の身許が分からないアプリケーションを開くには
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
62
CloudKitアプリケーションのテスト
まとめ
1.
Finderで、Controlキーを押しながらアプリケーションのアイコンをクリックします。
2.
「Open」ボタンを押してください。
3.
表示されるGatekeeperダイアログで「Open」をクリックします。
まとめ
この章では次の事項を解説しました。
●
各種の方法で、テスト用にCloudKitアプリケーションを配布する手順
●
アプリケーションが動作するデバイスを制限する方法
●
iOSアプリケーションの場合、開発環境と実稼働環境のどちらのコンテナをテストに用いるか選択
する方法
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
63
スキーマの配備
スキーマが最終的な形になり、開発環境でアプリケーションをテストすれば、いよいよ実稼働環境に
スキーマを配備できます。開発環境のスキーマを実稼働環境に組み込みますが、レコードはコピーし
ません。配備後、必要かどうか判断しながら、実稼働環境に移していくことになります。その上で、
実稼働環境でもテストしてください。これ以後も開発環境でスキーマを変更することは可能ですが、
レコード型を生成し、フィールドを追加する操作に限ります。今後、開発環境のスキーマを配備する
と、変更内容が実稼働環境のスキーマにマージされることになります。
この章で説明する作業を実行するためには、実稼働環境を編集する権限が必要です。個人開発者であ
れば、チーム管理者でもあるため、この権限があります。そうでなければ、チーム管理者に実行を委
ねるか、「Edit Production」権限を付与してもらってください(“他のチームメンバーに役割を割り当
てる” (69 ページ)を参照)。
アプリケーションをストアに登録する際には、『App Distribution Guide 』の“Submitting Your App”を参
照してください。
開発環境のスキーマを実稼働環境に配備する
アプリケーションを初めて配備するのであれば、CloudKitはコンテナスキーマを実稼働環境にコピー
します。レコード型、セキュリティ上の役割、サブスクリプション型などがコピーの対象ですが、開
発環境で生成したレコードは対象外です。スキーマを実稼働環境に配備してしまえば、開発環境で、
レコード型やフィールドを削除することはできません。
Warning: 実稼働環境のレコードを表示して確認したければ、事前に、該当するレコード型の
IDメタデータインデックスを有効にしてください(“メタデータIDインデックスを有効にす
る” (25 ページ)を参照)。実稼働環境のメタデータインデックスを変更することはできま
せん。
スキーマを実稼働環境に配備するには
1.
CloudKit Dashboardの左側列にある「Deployment」を押します。
2.
「Deploy to Production」を押してください。
3.
インデックスに関するダイアログが現れた場合は、「Optimize Indexes」または「Deploy Unused」
を押します。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
64
スキーマの配備
開発環境のスキーマを実稼働環境に配備する
CloudKitは開発環境におけるインデックスの使用状況を追跡し、各インデックスのコストやサイ
ズを見積もって表示します。
●
●
●
●
4.
使っていないインデックスの詳細を確認したいとき:「Unused Index Details」を押してくだ
さい。
使っていないインデックスを削除した上でスキーマを配備したいとき:「Optimize Indexes」
を押してください。
インデックスをそのまま保持したいとき:「Deploy Unused」を押してください。
インデックスの使用状況を分析した上で先に進みたいとき:「Cancel」を押し、“使っていな
いインデックスを無効にする” (67 ページ)を参照してください。
ダイアログが現れるので、表示内容をよく読んだ上で、「Optimize & Deploy」または「Deploy
Unused Indexes」を押してください(先のダイアログで選択した事項に応じ、いずれか一方が現
れます)。
ここまでの結果を確認する
スキーマが実稼働環境に正しくコピーされていることを確認します。
実稼働環境のスキーマやデータを表示するには
1.
左下隅の「Development」ボタンを押します。
2.
するとダイアログが表示されるので、「Production」を押してください。
画面の内容が、開発環境から実稼働環境に変わります。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
65
スキーマの配備
開発環境のスキーマを実稼働環境に配備する
3.
「Record Types」を押し、表示しようとするレコード型を選択してください。
4.
「Default Zone」を押すと公開レコードが表示されます。
開発環境の表示に戻りたいときは、左下隅の「Production」ボタンを押し、「Development」に切り替
えてください。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
66
スキーマの配備
開発環境におけるスキーマの変更を実稼働環境に反映する
開発環境におけるスキーマの変更を実稼働環境に反映する
スキーマを実稼働環境に配備するのが2回目以降であれば、可能なのはレコード型やフィールドを追
加することだけです。スキーマの一部を削除することはできません。CloudKit Dashboardは、新たに
加わったレコード型やフィールドを、実稼働環境のスキーマにマージします。実際に配備する前に、
変更内容を確認する機会があります。
開発環境のスキーマを実稼働環境に反映するには
1.
開発環境で、左列の「Deployment」を押し、スキーマに施した変更内容を確認してください。
CloudKit Dashboardには、レコード型、サブスクリプション型、セキュリティ上の役割に対して施
された、変更事項が表示されます。
2.
「Deploy to Production」を押してください。
3.
インデックスに関するダイアログが現れた場合は、「Optimize Indexes」または「Deploy Unused」
を押します。
CloudKitは開発環境におけるインデックスの使用状況を追跡します。使っていないインデックス
のコストやサイズ(見積もり値)を確認したければ、「Unused Index Details」を押してください。
4.
ダイアログが現れるので、表示内容をよく読んだ上で、「Optimize & Deploy」または「Deploy
Unused Indexes」を押してください。
使っていないインデックスを無効にする
インデックスを用いると、レコードを高速に取得できます。そこでCloudKit Dashboardは、レコード
型の各フィールドについて、インデックスを生成するようになっています。CloudKitはフィールド型
に応じて、整列、クエリ、検索用のインデックスを生成します。したがってクエリを生成する際に
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
67
スキーマの配備
使っていないインデックスを無効にする
も、あらゆるフィールドを組み合わせることができます。しかし、実稼働環境で、何の操作にも使っ
ていないインデックスを保持、格納しておくのは、無駄でしかありません。これを無効にすれば、公
開、非公開のデータベースとも、ディスク容量の節約になります。
CloudKitは、開発環境、実稼働環境の両方について、インデックスの使用状況を追跡します。開発環
境のスキーマを配備あるいはマージする前に、アプリケーションを通しでテストし、実稼働環境にお
けるインデックスの使用状況を調べてください。整列、クエリ、検索の操作に用いないフィールドに
ついては、インデックスを無効にして構いません。CloudKit Dashboardには、使用状況にもとづき、
インデックスのコストを見積もる機能も組み込まれています。
使っていないインデックスを無効にすることができるのは、開発環境か実稼働環境かを問いません。
フィールドのインデックスを無効に/有効にするには
1.
左側列の「Record Types」を押してください。
2.
第2列からいずれかのレコード型を選択してください。
フィールド名と型が、右側の詳細領域に現れます。「Index」列にはチェックボックス、「Cost」
列にはインデックスのコスト見積もり値があります。
3.
「Index」列のチェックボックスをオフにすれば該当する型のインデックスが無効に、オンにすれ
ば有効になります。
●
●
整列記述子(CKQueryのsortDescriptorsメソッドで指定)に埋め込んで、あるいはレコー
ドを整列する(“レコードを整列する” (34 ページ)を参照)ために使うことのないフィール
ドについては、「Sort」チェックボックスをオフにします。
アプリケーションが実行するクエリ(CKQueryまたはCKQueryOperationオブジェクト)に使
うことのないフィールドについては、「Query」チェックボックスをオフにします。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
68
スキーマの配備
他のチームメンバーに役割を割り当てる
●
レコードの検索(“レコードを検索する” (34 ページ)を参照)に用いないフィールドについ
ては、「Search」チェックボックスをオフにしてください。
スキーマを実稼働環境に配備する際に現れるダイアログ(“開発環境のスキーマを実稼働環境に配備
する” (64 ページ)を参照)でも、使わないインデックスを無効にすることができます。
他のチームメンバーに役割を割り当てる
会社アカウントの場合、CloudKitアプリケーションを配備する責任の一部を、他のメンバーに委ねる
ことができます。これは次のように、メンバーの権限を変更することによりおこないます。
権限
解説
チームの管理
他のチームメンバー(チームエージェントを除く)の権限を変更できま
す。チームエージェントは常に、あらゆる権限を持っています。
開発環境の編集
実稼働環境の編集
●
CloudKit Dashboardで開発環境のスキーマを編集できます。
●
開発環境のレコードを表示できます。
●
開発環境のスキーマを実稼働環境に配備できます。
●
実稼働環境のスキーマを表示できます。
●
実稼働環境のレコードを表示、編集できます。
チームメンバーの権限は、コンテナごとに個別に設定します。チームに属するコンテナすべてに適用
されるわけではありません。
チームメンバーに権限を付与するには
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
69
スキーマの配備
まとめ
1.
CloudKit Dashboardの左列にある「Team」を押してください。
2.
該当するチームメンバーの行、「Privileges」列で、付与しようとする権限を選択します。
変更できない、あるいは変更する権限がない場合、チェックボックスは無効になっています。
まとめ
この章では、開発環境のスキーマを実稼働環境に配備する手順、開発作業を進めながらスキーマを最
新の状態に維持する方法を解説しました。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
70
書類の改訂履歴
この表は「CloudKitクイックスタート 」の改訂履歴です。
日付
メモ
2015-09-16
Xcode 7.0 の変更に合わせて改訂しました。
2015-06-27
最新版のCloudKit Dashboardに合わせて画面例を更新したほか、全
体にわたって細かな修正を施しました。
2015-04-08
「Adding Reference Attributes」の章を追加し、CloudKit Dashboardの
インデックス機能に関して「スキーマの配備」の章を改訂しまし
た。
2014-10-31
新規資料。CloudKitアプリケーションの開発手順を紹介しています。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
71
用語解説
非公開データベース(private database) ユー
ザが所有するレコードを格納するデータベー
ス。ユーザがデバイス上でiCloud証明書を入力
しない限り、アプリケーションが内容を読むこ
とはできません。
Apple Push Notificationサービス(Apple Push
Notification service(APNs)) iOS/OS Xデバイ
スに情報を伝達するAppleサービス。
CloudKit アプリケーションやユーザデータを
構造化してiCloudに格納するアプリケーション
サービス。
実稼働環境(production environment) App
StoreやMac App Storeを通して販売したアプリ
ケーションがアクセスするデータベース。
コンテナ(container) いくつかのアプリケー
ションが利用する、複数のデータベースから成
るデータストア。デフォルトコンテナのIDは、
アプリケーションのバンドルIDと一致します。
公開データベース(public database) アプリ
ケーションが所有し、ユーザ間で共有するレ
コードを格納するデータベース。iCloudアカウ
ントがなくても読み取りは可能ですが、レコー
ドを書き込むことはできません。
コンテナ ID(container ID) アプリケーション
の iCloud コンテナの一意の識別子。
データベース(database) コンテナを区分し
た領域で、レコードの格納に用います。アプリ
ケーション用の公開データベースがひとつある
ほか、非公開のデータベースがユーザごとに存
在します。
プッシュ通知(push notifications) プロバイ
ダからデバイスに向けて、APNが配送する通知。
レコード(record) レコード型のインスタン
ス。生成し、データベースから読み取り、デー
タベースに書き込むことが可能です。
開発環境(development environment) アプリ
ケーションを開発し、スキーマを構築していく
ためのデータベース。App StoreやMac App Store
を通して販売したアプリケーションからはアク
セスできません。
レコードID(record identifier) データベース
において、レコードの場所を表す識別子。レ
コード名とゾーンから成ります。
レコード名(record name) あるゾーン内で一
意的な、レコードの識別子。アプリケーション
が生成します。他のデータ源の中で、外部キー
として使うことができます。
フィールド(field) レコード型のプロパティ。
キーと値の組を用いて設定可能です。
実行時スキーマ(just-in-time schema) 開発環
境の機能のひとつ。レコードを保存することに
よりスキーマを生成できます。
レコード型(record type) フィールドが共通
な一連のレコードのテンプレート。
述語(predicate) キー値コーディングに準拠
した形で、オブジェクトの論理的な検索条件を
定義するオブジェクト。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
72
用語解説
レコードゾーン(record zone) レコードを格
納するデータベース内の区画。データベースに
はそれぞれデフォルトゾーンがあるほか、カス
タムゾーンを追加できます。
関係(relationship) あるレコードを別のレコー
ドに関連づけるために用いるレコード型フィー
ルド。
役割(role) ユーザグループに対して与える、
公開データベースにレコードを生成し、読み取
り/書き込みをおこなう権限。world、
authenticated、creatorという役割があります。
スキーマ(schema) データベース内のレコー
ド、フィールド、関係を記述したメタデータの
集合。CloudKitの場合、スキーマにはレコード
型、セキュリティ上の役割、サブスクリプショ
ン型が含まれます。
サブスクリプション(subscription) サーバ上
で動作する永続的なクエリで、レコードに変更
が施されたときに通知を出すもの。
対多関係(to-many relationship) 単一のレコー
ドと、1つ以上の別のレコードとの結びつき。
対1関係(to-one relationship) 単一のレコー
ドと、別の単一のレコードとの結びつき。
2015-09-16 | Copyright © 2015 Apple Inc. All Rights Reserved.
73
Apple Inc.
Copyright © 2015 Apple Inc.
All rights reserved.
本書の一部あるいは全部を Apple Inc. から書
面による事前の許諾を得ることなく複写複製
(コピー)することを禁じます。また、製品
に付属のソフトウェアは同梱のソフトウェア
使用許諾契約書に記載の条件のもとでお使い
ください。書類を個人で使用する場合に限り
1 台のコンピュータに保管すること、またそ
の書類にアップルの著作権表示が含まれる限
り、個人的な利用を目的に書類を複製するこ
とを認めます。
Apple ロゴは、米国その他の国で登録された
Apple Inc. の商標です。
キーボードから入力可能な Apple ロゴについ
ても、これを Apple Inc. からの書面による事
前の許諾なしに商業的な目的で使用すると、
連邦および州の商標法および不正競争防止法
違反となる場合があります。
本書に記載されているテクノロジーに関して
は、明示または黙示を問わず、使用を許諾し
ません。 本書に記載されているテクノロジー
に関するすべての知的財産権は、Apple Inc.
が保有しています。 本書は、Apple ブランド
のコンピュータ用のアプリケーション開発に
使用を限定します。
本書には正確な情報を記載するように努めま
した。 ただし、誤植や制作上の誤記がないこ
とを保証するものではありません。
Apple Inc.
1 Infinite Loop
Cupertino, CA 95014
U.S.A.
Apple Japan
〒106-6140 東京都港区六本木 6
丁目10番1号 六本木ヒルズ
http://www.apple.com/jp
Offline copy. Trademarks go here.
Apple Inc. は本書の内容を確認しておりますが、本
書に関して、明示的であるか黙示的であるかを問わ
ず、その品質、正確さ、市場性、または特定の目的
に対する適合性に関して何らかの保証または表明を
行うものではありません。その結果、本書は「現状
有姿のまま」提供され、本書の品質または正確さに
関連して発生するすべての損害は、購入者であるお
客様が負うものとします。
いかなる場合も、Apple Inc. は、本書の内容に含ま
れる瑕疵または不正確さによって生じる直接的、間
接的、特殊的、偶発的、または結果的損害に対する
賠償請求には一切応じません。そのような損害の可
能性があらかじめ指摘されている場合においても同
様です。
上記の損害に対する保証および救済は、口頭や書面
によるか、または明示的や黙示的であるかを問わ
ず、唯一のものであり、その他一切の保証にかわる
ものです。 Apple Inc. の販売店、代理店、または従
業員には、この保証に関する規定に何らかの変更、
拡張、または追加を加える権限は与えられていませ
ん。
一部の国や地域では、黙示あるいは偶発的または結
果的損害に対する賠償の免責または制限が認められ
ていないため、上記の制限や免責がお客様に適用さ
れない場合があります。 この保証はお客様に特定
の法的権利を与え、地域によってはその他の権利が
お客様に与えられる場合もあります。