Programming/Mac & iOS

[iOS] iOS에서 Cloud 활용 (Cloud Kit 요약 정리)

MB Brad KWON 2014. 9. 1. 15:10
Cloud Kit


CKContainer : 앱의 public/private 컨텐츠를 캡슐화한 객체이다.
CKDataBase : 앱 컨테이너에 담긴 public/private 데이터들에게 접근하기 위한 통로이다.
CKRecord : record의 컨텐츠를 관리하기 위한 인터페이스

    Record는 key-value pair로 key는 레코드에서 field 값에 해당한다. 각 field의 값은 string, number, date뿐만 아니라 파일, 데이터 블록 그리고 다른 Record와 관계를 맺기 위해 다른 Record의 reference도 넣을 수 있다.

    CloudKit은 container들을 이용하여 데이터를 구성한다. 각 container별로 entitlement가 필요하고 런타임에서 CKContainer 객체를 이용하여 특정 container에 대해 task를 수행한다.

    각 container는 public/private database로 나뉘어 있다. 각 database는 CKDatabase로 표현된다. private database에 쓰여진 데이터는 데이터를 쓸 때의 사용자의 iCloud 계정에 저장되며 현재 사용자의 한해서만 볼 수 있다. public database에 저장된 데이터는 앱의 iCloud 저장소에 저장되며 앱의 모든 사용자가 볼 수 있다.




CloudKit 앱이 구동하는 동안 iCloud 계정이 활성화 안 된 상태라도 public database는 항상 읽을 수 있다. public database에 데이터를 저장하거나 private database에 접근하기 위해서는 iCloud 계정을 기기상에서 활성화 시켜야한다. public databae에서 데이터를 읽는 외의 작업을 한다면 iCloud 계정이 활성화 되었는지 확인한다.



    CKRecord 클래스를 이용하여 key-value pair로 데이터를 저장한다. value에는 string, number, date등의 단순한 값 뿐만 아니라 location, 다른 record의 reference, 파일 등도 넣을 수 있다.
    record에 명시적으로 데이터를 써야한다. NSOperation 객체와 CKContainer, CKDatabase의 메소드를 사용하여 데이터를 쓰거나 fetch할 수 있다. Fetch operation은 fetch하고자 하는 record의 ID를 미리 알고 있어야한다.
    record의 ID를 모를 경우엔 predicate를 사용하여 record를 검색할 수 있다. predicate에 사용하는 query는 CKQuery객체를 사용한다. query를 실행 시키기위해서 CKQueryOperation을 사용한다.
    CKSubscription으로 서버에 한번만 subscription을 저장하면 해당하는 부분의 데이터가 변경될 때마다 서버에서 push notification을 통해 알려준다.

    CloudKit은 개발 환경과 상용 환경을 구분하여 제공한다. 개발 환경은 유연한 환경을 개발팀의 멤버들에게만 제공한다. 개발 환경에서 record에 새로운 field를 추가하여 저장할 때, 서버는 자동으로 새로운 스키마를 업데이트한다. 이 특징을 이용하여 개발 기간동안 스키마를 변경하는데 드는 시간을 아낄 수 있다. 단, 새로운 field를 추가하고 나서 field의 type을 변경하는 것은 직접 CloudKit Dashboard를 활용하여 filed를 지우고 새로 field를 추가하여야 한다.
    앱을 배포하기에 앞서 스키마와 데이터들을 CloudKit Dashboard를 사용하여 상용 환경에 migrate해야한다. 상용에서 구동될 때는 서버에서 스키마가 소프트웨어적으로 변하는 것을 막는다. CloudKit Dashboard를 통하여 여전히 바꿀 수는 있지만 상용 환경에서 record에 field를 추가하려하면 에러가 발생한다.
    개발하는 동안 Xcode가 자동으로 개발 환경으로 앱을 빌드한다. 앱을 배포하기 전에 배포 과정에서 개발환경을 쓸 것인지 상용 환경을 쓸것인지를 선택한다. 여기서 꼭 상용 환경을 선택해야한다. 개발환경으로 선택된 앱은 App Store에 의해 reject된다.


**CloudKit 동작에 관한 총정리**

  1. CKContainer 객체를 이용하여 접근하고자 하는 데이터가 있는 iCloud container를 얻는다.
  2. CKDatabase 객체로 해당 record가 존재하는 public/private database를 얻는다.
  3. fetch하기 원하는 데이터를 식별한다. record ID를 알 경우, CKFetchRecordOperation을 사용한다. record ID를 모를 경우, CKQuery를 만든 후, CKQueryOperation을 사용한다.
  4. 결과 값을 다루기 위해 operation의 completion handler에 블럭을 정의한다.
  5. operation 객체를 CKDatabase 객체의 addOperation: 메소드로 큐에 넣어 실행시킨다. operation 객체는 completion block을 통하여 비동기적으로 결과값을 처리할 것이다.


CloudKit Operations


Fetch & Modify records

  1. CKFetchRecordChangesOperation
  2. CKFetchRecordOperation
  3. CKModifyRecordOperation
  4. CKQueryOperation

Zones
  1. CKFetchRecordZonesOperation
  2. CKModifyRecordZonesOperation

Users
  1. CKDiscoverAllContactsOperation
  2. CKDiscoverUserInfosOperation

Notification
  1. CKFetchNotificationChangesOperation
  2. CKMarkNotificationReadOperation

Subscription
  1. CKFetchSubsriptionOperation
  2. CKModifySubscriptionOperation
  3. CKModifyBadgeOperation


see How to use CloudKit


sample code of CloudKit