What you need is to get an entitlements file so the app can access your iCloud and write records using CloudKit.
Follow the steps to grant access to iCloud from your app:
1- Select the project in the Project Navigator, and then open the General tab.
2- In the Identity section, set your developer Apple ID to the Team dropdown menu. (If it is not available, add it in Xcode menu -> Preferences -> Accounts.
3- Go to Capabilities tab in the project properties and turn iCloud on. Then, select "Key-Value Storage" and "CloudKit".
4- Make sure these items are checked:
If all of the items are checked, then your app is ready to use CloudKit.
All the records create using CloudKit-related code can be previewed, edited and even removed in CloudKit Dashboard. To access CloudKit Dashboard, go here.
There are several parts in the dashboard:
Here, you get a list of all the existing record types in the app. When you first open CloudKit Dashboard for an app, there’s a record type called Users there, which you can use it or just delete it and use your own.
In this page, you could make your data typed manually. Of course, in most cases this is pointless, because iOS SDK can handle it way better than the dashboard, but the functionality is also there if you prefer. The most use of this page is for previewing types.
To save date to CloudKit, we must make:
CKRecordID
(the key of your unique record)CKRecord
(which includes data)To ensure that every new record identifier is unique, we use the current timestamp, which is unique. We get the timestamp using NSDate
's method timeIntervalSinceReferenceDate()
. It is in form of ###.### (# are numbers), which we will use the integer part. To do this, we split the string:
let timestamp = String(format: "%f", NSDate.timeIntervalSinceReferenceDate())
let timestampParts = timestamp.componentsSeparatedByString(".")
let recordID = CKRecordID(recordName: timestampParts[0])
To make the record, we should specify the record type (explained in Using CloudKit Dashboard) as Users, the ID as the thing we made just now and the data. Here, we will add a sample text, a picture and the current date to the record:
let record = CKRecord(recordType: "Users", recordID: recordID)
record.setObject("Some Text", forKey: "text")
record.setObject(CKAsset(fileURL: someValidImageURL), forKey: "image")
record.setObject(NSDate(), forKey: "date")
CKRecord *record = [[CKRecord alloc] initWithRecordType: "Users" recordID: recordID];
[record setObject: "Some Text" forKey: "text"];
[record setObject: [CKAsset assetWithFileURL: someValidImageURL] forKey: "image"];
[record setObject: [[NSDate alloc] init] forKey: "date"];
Note
Here, we didn't add the
UIImage
directly to the record, because as mentioned in Remarks, image format isn't directly supported in CloudKit, so we have convertedUIImage
intoCKAsset
.
let container = CKContainer.defaultContainer()
let database = container.privateCloudDatabase // or container.publicCloudDatabase
database.saveRecord(record, completionHandler: { (_, error) -> Void in
print(error ?? "")
})