Upgrade to Pro — share decks privately, control downloads, hide ads and more …

What's new in CloudKit and building apps withou...

What's new in CloudKit and building apps without your own server.

Presentation on CocoaHeads Hong Kong's 2016 July meet up.

Avatar for Simon Pang

Simon Pang

July 14, 2016
Tweet

Other Decks in Programming

Transcript

  1. CloudKit vs Conventional Backend CloudKit Conventional App centric Server/API centric

    Generic Apple server App specific server No server logics allowed Your own server logics Users have control Server have control
  2. CloudKit Features • Query • Fetch Database Change • Subscription

    • Asset • Long Live Operations • Sharing • CloudJS
  3. struct Todo { var identifier: CKRecordID var title: String }

    let database = ... func createTodoRecord(title: String, completionHandler: (Todo, NSError?)->()) { let record = CKRecord(recordType: "Todo") record["title"] = title let op = CKModifyRecordsOperation(recordsToSave: [record], recordIDsToDelete: nil) op.perRecordCompletionBlock = {...} database.add(op) }
  4. func cloudKitStartup() { container.accountStatus { (status, maybeError) in if let

    error = maybeError { // handling } switch status { case .available: // handling case .restricted: // handling case .noAccount: // handling case .couldNotDetermine: // handling } } }
  5. class CloudKitManager { var operationQueue = OperationQueue() init() { operationQueue.isSuspended

    = true // suspended until account status is available container.accountStatus {(status, maybeError) in switch status { case .available: operationQueue.isSuspended = false case ...: // usual handling } } }
  6. struct Todo { var identifier: CKRecordID var title: String }

    let database = ... func createTodoRecord(title: String, completionHandler: (Todo, NSError?)->()) { let record = CKRecord(recordType: "Todo") record["title"] = title let op = CKModifyRecordsOperation(recordsToSave: [record], recordIDsToDelete: nil) op.perRecordCompletionBlock = {…} op.database = database operationQueue.addOperation(op) }
  7. What can you put inside CKRecord? • NSString, NSNumber, NSDate,

    NSData • CLLocation • CKAsset • CKReference • NSArray containing objects of any of the types above
  8. class ICFolder { var titleEncrypted: NSData // ... } class

    ICNote { var titleEncrypted: NSData var snippetEncrypted: NSData var folders: [CKReference] var deleted: Bool var modificationDate: Date // ... var firstAttachmentThumbnail: CKAsset? var firstAttachmentThumbnailOrientation: Int? var firstAttachmentUTIEncrypted: NSData? }
  9. class ICAttachment { var media: CKReference var height: Double var

    width: Double var UTIEncrypted: NSData var note: CKReference var titleEncrypted: NSData var previewHeights: [Double] var previewWidths: [Double] var previewImages: [CKAsset] var previewScales: [Double] var previewScaleWhenDrawings: [Double] var previewUpdateDate: Date var deleted: Bool var lastModificationDate: Date var fileSize: Int // ... }
  10. How it works (for sender)? • CKShare • UICloudSharingController •

    CKModifyRecordsOperation • Send out the URL
  11. How it works (for recipient)? • NSURL -> CKShareMetadata •

    CKFetchShareMetadataOperation OR • userAcceptedCloudKitShareWithMetadata: • CKAcceptSharesOperation
  12. Gotcha! • Handle version conflict • Handle rate limit exceed

    • Private/Public/Shared databases are not the same • Dashboard user limitation
  13. Recap • What’s new in CloudKit • What’s CloudKit •

    Getting Started • Data Modeling • Sharing
  14. References • Apple iCloud Resources • https://developer.apple.com/icloud/ • WWDC CloudKit

    sessions • https://developer.apple.com/videos/play/wwdc2016/226/ • https://developer.apple.com/videos/play/wwdc2016/231/ • https://developer.apple.com/videos/play/wwdc2015/715/ • YapDatabase • https://github.com/yapstudios/YapDatabase