CloudKit
Remarks#
Supported Types
- NSData
- NSDate (Date)
- NSNumber (Int / Double)
- NSString (String)
- NSArray (Array)
- CLLocation
- CKReference
- CKAsset
Registering app for use with CloudKit
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.
Using CloudKit Dashboard
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:
- Record Types (which will be discussed later)
- Security Roles (which is where you can set databases as public or private)
- Subscription Types (which your app could register for Apple Push Notifications (APNs) to notify you when a record is changed)
Record Types
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.
Saving data to CloudKit
To save date to CloudKit, we must make:
- A
CKRecordID
(the key of your unique record) - A
CKRecord
(which includes data)
Making a record key
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:
Swift
let timestamp = String(format: "%f", NSDate.timeIntervalSinceReferenceDate())
let timestampParts = timestamp.componentsSeparatedByString(".")
let recordID = CKRecordID(recordName: timestampParts[0])
Making the record
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:
Swift
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")
Objective-C
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
.
Accessing the container
Swift
let container = CKContainer.defaultContainer()
let database = container.privateCloudDatabase // or container.publicCloudDatabase
Saving the records to CloudKit database
Swift
database.saveRecord(record, completionHandler: { (_, error) -> Void in
print(error ?? "")
})