CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing...
Transcript of CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing...
![Page 1: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/1.jpg)
CloudKitJust another iCloud API?
Michael Ochs
![Page 2: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/2.jpg)
What is CloudKit?
![Page 3: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/3.jpg)
What is CloudKit?
“The CloudKit framework provides interfaces for moving data between your app and your iCloud containers”
- CloudKit Framework Reference
![Page 4: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/4.jpg)
What is CloudKit?
“CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing the
transfer of data to and from iCloud servers.”
- CloudKit Framework Reference
![Page 5: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/5.jpg)
What is CloudKit?
• it is a transfer api to move data to and from the cloud
• it behaves like a remote database in many parts
• but: It is not your app’s database
![Page 6: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/6.jpg)
Structure
![Page 7: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/7.jpg)
Structure
• local api
• remote database
• remote dashboard
• records
• references
• containers
• queries
• operations
• zones
• subscriptions
![Page 8: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/8.jpg)
StructureData
Container
Public DatabasePrivate
DatabasePrivate
DatabasePrivate
Database
Private Database
Private Database
Private Database
Private Database
Private Database
Private Database
Bulk Storage
Zone
Record
Record
Record
Asset
Asset
Asset
![Page 9: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/9.jpg)
StructureConvenience API
CKContainer CKDatabase
CKRecord
![Page 10: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/10.jpg)
StructureConvenience API
CKContainer CKDatabase
CKRecord
CKQuery
![Page 11: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/11.jpg)
StructureConvenience API
CKContainer CKDatabase CKSubscription
![Page 12: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/12.jpg)
StructureNot so convenient API
CKContainer CKDatabase
CKRecord
CKModifyRecordsOperation
CKRecord
CKQueryOperation
CKQuery
CKRecordCKModifySubscriptionsOperation
CKSubscription
![Page 13: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/13.jpg)
StructureInconvenient API
CKModifyRecordsOperation
CKQueryOperation
CKModifySubscriptionsOperation CKModifyRecordZonesOperation
CKFetchSubscriptionsOperation CKFetchRecordZonesOperationCKFetchRecordsOperation
CKFetchRecordChangesOperation
CKDiscoverAllContactsOperation
CKDiscoverUserInfosOperation
CKFetchNotificationChangesOperation
CKMarkNotificationsReadOperation
CKModifyBadgeOperation
![Page 14: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/14.jpg)
CKModifyRecordsOperation
CKQueryOperation
CKModifySubscriptionsOperation CKModifyRecordZonesOperation
CKFetchSubscriptionsOperation CKFetchRecordZonesOperationCKFetchRecordsOperation
CKFetchRecordChangesOperation
CKDiscoverAllContactsOperation
CKDiscoverUserInfosOperation
CKFetchNotificationChangesOperation
CKMarkNotificationsReadOperation
CKModifyBadgeOperation
Structure InternalError
PartialFailure
NetworkUnavailable
NetworkFailure
BadContainer
ServiceUnavailable
RequestRateLimited
MissingEntitlement
NotAuthenticated
PermissionFailure
UnknownItem
InvalidArguments
ResultsTruncated
ServerRecordChanged
ServerRejectedRequest
AssetFileNotFound
AssetFileModified
IncompatibleVersion
ConstraintViolation
OperationCancelled
ChangeTokenExpired
BatchRequestFailed
ZoneBusy
BadDatabase
QuotaExceeded
ZoneNotFound
![Page 15: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/15.jpg)
CKModifyRecordsOperation
CKQueryOperation
CKModifySubscriptionsOperation CKModifyRecordZonesOperation
CKFetchSubscriptionsOperation CKFetchRecordZonesOperationCKFetchRecordsOperation
CKFetchRecordChangesOperation
CKDiscoverAllContactsOperation
CKDiscoverUserInfosOperation
CKFetchNotificationChangesOperation
CKMarkNotificationsReadOperation
CKModifyBadgeOperation
Structure
Do not start with CloudKit in your productive application!
![Page 16: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/16.jpg)
Structure
• This api has nothing to do with convenience
• …but this api is great
• It gives you a lot of responsibility
• …but also a lot of power and flexibility
![Page 17: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/17.jpg)
Dashboard
![Page 18: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/18.jpg)
Dashboard
• Web based administration
• View, create, edit, and remove records
• Edit, and remove record layouts
• Edit access groups / privileges
![Page 19: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/19.jpg)
![Page 20: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/20.jpg)
![Page 21: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/21.jpg)
Demo
![Page 22: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/22.jpg)
CKDatabase
![Page 23: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/23.jpg)
CKDatabase
• Public database
• readable by everyone
• writable by every iCloud user
• Private database
• readable and writable by the current iCloud user
![Page 24: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/24.jpg)
CKDatabase
CKContainer *container = [CKContainer defaultContainer];CKDatabase *database = [container publicCloudDatabase];
Public Database
![Page 25: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/25.jpg)
CKDatabase
CKContainer *container = [CKContainer defaultContainer];CKDatabase *database = [container publicCloudDatabase];
Public Database
![Page 26: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/26.jpg)
CKDatabase
CKContainer *container = [CKContainer defaultContainer];CKDatabase *database = [container publicCloudDatabase];
Public Database
![Page 27: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/27.jpg)
CKDatabase
CKContainer *container = [CKContainer defaultContainer];CKDatabase *database = [container privateCloudDatabase];
Private Database
![Page 28: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/28.jpg)
CKDatabase
CKContainer *container = [CKContainer defaultContainer];CKDatabase *database = [container privateCloudDatabase];
Private Database
![Page 29: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/29.jpg)
CKDatabaseCKRecordID *recordID = …;[database deleteRecordWithID:recordID completionHandler:^(CKRecordID *recordID, NSError *error) { if (error) { dispatch_async(dispatch_get_main_queue(), ^{ [self presentError:error completionHandler:^(BOOL didRecover){ // TODO: handle error }]; }); return; } // TODO: handle success}];
![Page 30: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/30.jpg)
CKDatabaseCKRecordID *recordID = …;[database deleteRecordWithID:recordID completionHandler:^(CKRecordID *recordID, NSError *error) { if (error) { dispatch_async(dispatch_get_main_queue(), ^{ [self presentError:error completionHandler:^(BOOL didRecover){ // TODO: handle error }]; }); return; } // TODO: handle success}];
![Page 31: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/31.jpg)
CKDatabaseCKRecordID *recordID = …;[database deleteRecordWithID:recordID completionHandler:^(CKRecordID *recordID, NSError *error) { if (error) { dispatch_async(dispatch_get_main_queue(), ^{ [self presentError:error completionHandler:^(BOOL didRecover){ // TODO: handle error }]; }); return; } // TODO: handle success}];
![Page 32: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/32.jpg)
CKRecord
![Page 33: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/33.jpg)
CKRecord
• Data object
• Dictionary like api
• On the fly model generation
![Page 34: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/34.jpg)
CKRecord
Each record has a…
• …record type
• …record id
• …creation date / user record id
• …modification date / user record id
![Page 35: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/35.jpg)
CKRecord
Class
record type
record id
creation date / user record id
modification date / user record id
Type
NSString*
CKRecordID*
NSDate* / CKRecordID*
NSDate* / CKRecordID*
![Page 36: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/36.jpg)
CKRecord
CloudKit
record type
record id
creation date / user record id
modification date / user record id
CoreData
entity name
object id
n/a
n/a
![Page 37: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/37.jpg)
CKRecord
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Todo"];record[@"title"] = @"Get christmas presents";[database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store record id to your local model}];
![Page 38: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/38.jpg)
CKRecord
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Todo"];record[@"title"] = @"Get christmas presents";[database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store record id to your local model}];
![Page 39: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/39.jpg)
CKRecord
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Todo"];record[@"title"] = @"Get christmas presents";[database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store record id to your local model}];
![Page 40: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/40.jpg)
CKRecord
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Todo"];record[@"title"] = @"Get christmas presents";[database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store record id to your local model}];
![Page 41: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/41.jpg)
CKRecord
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Todo"];record[@"title"] = @"Get christmas presents";[database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store record id to your local model}];
![Page 42: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/42.jpg)
Container
Public Database
Zone
CKRecord
TodocreationDate
modificationDatetitle
![Page 43: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/43.jpg)
CKRecordCKRecordID *recordID = …; // get record id from your model[database fetchRecordWithID:recordID completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } record[@"done"] = @YES; [database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { // TODO: check & handle error }];}];
![Page 44: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/44.jpg)
CKRecordCKRecordID *recordID = …; // get record id from your model[database fetchRecordWithID:recordID completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } record[@"done"] = @YES; [database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { // TODO: check & handle error }];}];
![Page 45: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/45.jpg)
CKRecordCKRecordID *recordID = …; // get record id from your model[database fetchRecordWithID:recordID completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } record[@"done"] = @YES; [database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { // TODO: check & handle error }];}];
![Page 46: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/46.jpg)
CKRecordCKRecordID *recordID = …; // get record id from your model[database fetchRecordWithID:recordID completionHandler:^(CKRecord *record, NSError *error) { if (error) { // TODO: handle error return; } record[@"done"] = @YES; [database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { // TODO: check & handle error }];}];
![Page 47: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/47.jpg)
Container
Public Database
Zone
CKRecord
TodocreationDate
modificationDatetitle
TodocreationDate
modificationDatetitle
done
![Page 48: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/48.jpg)
CKSubscription
![Page 49: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/49.jpg)
CKSubscription
• Subscribe to push notifications
• Bound to a record type & predicate
• on create / on update / on delete
• silent / badge / alert / sound
![Page 50: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/50.jpg)
CKSubscription
• Configure push notifications
• Register for push notifications
• Subscribe to cloud kit
![Page 51: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/51.jpg)
CKSubscription
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application registerForRemoteNotifications]; return YES;} - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // trigger subscription}
![Page 52: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/52.jpg)
CKSubscription
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application registerForRemoteNotifications]; return YES;} - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // trigger subscription}
![Page 53: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/53.jpg)
CKSubscription
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application registerForRemoteNotifications]; return YES;} - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // trigger subscription}
![Page 54: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/54.jpg)
CKSubscription
NSPredicate *predicate = [NSPredicate predicateWithValue:YES];CKSubscriptionOptions options = ( CKSubscriptionOptionsFiresOnRecordUpdate | CKSubscriptionOptionsFiresOnRecordDeletion | CKSubscriptionOptionsFiresOnRecordCreation);CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Todo" predicate:predicate options:options];
![Page 55: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/55.jpg)
CKSubscription
NSPredicate *predicate = [NSPredicate predicateWithValue:YES];CKSubscriptionOptions options = ( CKSubscriptionOptionsFiresOnRecordUpdate | CKSubscriptionOptionsFiresOnRecordDeletion | CKSubscriptionOptionsFiresOnRecordCreation);CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Todo" predicate:predicate options:options];
![Page 56: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/56.jpg)
CKSubscription
NSPredicate *predicate = [NSPredicate predicateWithValue:YES];CKSubscriptionOptions options = ( CKSubscriptionOptionsFiresOnRecordUpdate | CKSubscriptionOptionsFiresOnRecordDeletion | CKSubscriptionOptionsFiresOnRecordCreation);CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Todo" predicate:predicate options:options];
![Page 57: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/57.jpg)
CKSubscription
NSPredicate *predicate = [NSPredicate predicateWithValue:YES];CKSubscriptionOptions options = ( CKSubscriptionOptionsFiresOnRecordUpdate | CKSubscriptionOptionsFiresOnRecordDeletion | CKSubscriptionOptionsFiresOnRecordCreation);CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Todo" predicate:predicate options:options];
![Page 58: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/58.jpg)
CKSubscriptionCKNotificationInfo *notificationInfo = [CKNotificationInfo new];notificationInfo.shouldSendContentAvailable = YES;subscription.notificationInfo = notificationInfo;[database saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store subscription id}];
![Page 59: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/59.jpg)
CKSubscriptionCKNotificationInfo *notificationInfo = [CKNotificationInfo new];notificationInfo.shouldSendContentAvailable = YES;subscription.notificationInfo = notificationInfo;[database saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store subscription id}];
![Page 60: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/60.jpg)
CKSubscriptionCKNotificationInfo *notificationInfo = [CKNotificationInfo new];notificationInfo.shouldSendContentAvailable = YES;subscription.notificationInfo = notificationInfo;[database saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store subscription id}];
![Page 61: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/61.jpg)
CKSubscriptionCKNotificationInfo *notificationInfo = [CKNotificationInfo new];notificationInfo.shouldSendContentAvailable = YES;subscription.notificationInfo = notificationInfo;[database saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store subscription id}];
![Page 62: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/62.jpg)
CKSubscriptionCKNotificationInfo *notificationInfo = [CKNotificationInfo new];notificationInfo.shouldSendContentAvailable = YES;subscription.notificationInfo = notificationInfo;[database saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store subscription id}];
![Page 63: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/63.jpg)
CKSubscriptionCKNotificationInfo *notificationInfo = [CKNotificationInfo new];notificationInfo.shouldSendContentAvailable = YES;subscription.notificationInfo = notificationInfo;[database saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) { if (error) { // TODO: handle error return; } // TODO: store subscription id}];
![Page 64: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/64.jpg)
CKSubscription
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: (void(^)(UIBackgroundFetchResult))completionHandler { // TODO: fetch updates and handle them completionHandler(UIBackgroundFetchResultNewData);}
![Page 65: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/65.jpg)
CKSubscription
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: (void(^)(UIBackgroundFetchResult))completionHandler { // TODO: fetch updates and handle them completionHandler(UIBackgroundFetchResultNewData);}
![Page 66: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/66.jpg)
CKSubscription
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: (void(^)(UIBackgroundFetchResult))completionHandler { // TODO: fetch updates and handle them completionHandler(UIBackgroundFetchResultNewData);}
![Page 67: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/67.jpg)
CKSubscription
• mark notifications as read
• fetch missed notifications
• handle badges on all devices
![Page 68: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/68.jpg)
// TODO: handle error
![Page 69: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/69.jpg)
// TODO: handle error
• You need to handle them
• Otherwise your data models will become inconsistent
• They might occur often
![Page 70: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/70.jpg)
// TODO: handle error
• Handle errors in a central place if possible
• HRSCustomErrorHandling might help you
![Page 71: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/71.jpg)
// TODO: handle error
CloudKit
Transaction cache
Data model
![Page 72: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/72.jpg)
// TODO: handle error
CloudKitTransaction cacheData model
![Page 73: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/73.jpg)
Problems
![Page 74: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/74.jpg)
Problems
• convenient API can not handle complexity of CloudKit
• lack of documentation
• strange behavior
• iOS simulator is not working
• privileges handling is lacking features
![Page 75: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/75.jpg)
Next steps
![Page 76: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/76.jpg)
Next steps
• experiment with the convenient api
• check if CloudKit is the right iCloud api for your task
• move to the operation based api
• get your models together
![Page 77: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/77.jpg)
Feedback / Questions
@_mochs
ios-coding.com
![Page 78: CloudKit - iOS CodingWhat is CloudKit? “CloudKit is not a replacement for your app’s existing data objects. Instead, CloudKit provides complementary services for managing theWhat](https://reader033.fdocuments.us/reader033/viewer/2022052722/5f0cbd277e708231d436e45c/html5/thumbnails/78.jpg)
Thank you