78
CloudKit Just another iCloud API? Michael Ochs

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

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// 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

// 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

// 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

// 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

// 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

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

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

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

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

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

Thank you