CloudKitを使ってPublic Dataなファイルをアプリに配信してみる。
(1) プロジェクト設定で、Project->CapabilitiesのiCloudをONに。
(2) iCloud Dashboardで、Record Type
を作る。名前などはなんでもいいが、Attribute Type=Assetのフィールドをひとつ作る。フィールド名もなんでもいいが、ここではfile
とする。
(3) Public Data->Dafault Zoneで上記で作ったRecord Typeのレコードを作成する。file
フィールドにファイルをアップロードする。レコードのIDをコピーしておく。
(4) アプリで上記のレコードをダウンロードする。
普通に書くとこんな感じ。"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"の部分は(3)でコピーしたレコードIDに置き換える。
@import CloudKit;
CKContainer *defaultContainer =[CKContainer defaultContainer];
CKDatabase *publicDatabase = [defaultContainer publicCloudDatabase];
CKRecordID *wellKnownID = [[CKRecordID alloc] initWithRecordName:@"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"];
[publicDatabase fetchRecordWithID:wellKnownID
completionHandler:^(CKRecord *fetchedParty, NSError *error) {
NSLog(@"erorr : %@", error);
CKAsset *asset = fetchedParty[@"file"];
// asset.fileURL.pathにファイルがダウンロードされてる
NSLog(@"%@", asset.fileURL.path);
}];
上記のコードだと優先度低で実行される。優先度を上げたければ、CKFetchRecordsOperation
を使えばいい。
CKFetchRecordsOperation * op = [[CKFetchRecordsOperation alloc] initWithRecordIDs:@[wellKnownID]];
op.queuePriority = NSOperationQueuePriorityVeryHigh;
op.perRecordProgressBlock = ^(CKRecordID * recordId, double progress) {
NSLog(@"progress : %lf", progress);
};
op.perRecordCompletionBlock = ^(CKRecord *fetchedParty, CKRecordID * recordId, NSError *error) {
NSLog(@"erorr : %@", error);
CKAsset *asset = fetchedParty[@"file"];
NSLog(@"%@", asset.fileURL.path);
};
[publicDatabase addOperation:op];
制限など
Start with:
- Storage
- 5GB for assets
- 50MB for database
Data Transfer
- 25MB/day for assets
- 250KB/day for database
Grow with every user:
- Storage
-- 100MB for assets
-- 1MB for database - Data Transfer
-- 0.5MB/user for assets
-- 5KB/user for database
Free up to:
- Storage
-- 1PB for assets
-- 10TB for database
Data Transfer
- 5TB/day for assets
- 50GB/day for database