iOS8
CloudKit

[iOS] CloudKit Storageを使ってファイルを配信する

More than 3 years have passed since last update.

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];


制限など

https://developer.apple.com/icloud/documentation/cloudkit-storage/

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