본문 바로가기
카테고리 없음

#1 CloudKit + CKSyncEngine - 기본 개념

by ARpple 2025. 5. 7.
 

CKSyncEngine | Apple Developer Documentation

An object that manages the synchronization of local and remote record data.

developer.apple.com

What is CKSyncEngine??

⇒ 로컬 및 원격 레코드(=iCloud) 데이터의 동기화를 관리하는 객체

  • 앱의 CloudKit 동기화 작업을 처리에 높은 성능과 안정성을 제공한다.
  • 시스템 조건(네트워킹, 베터리 상태 등의 리소스 조건)에 따라 동기화 엔진이 주기적으로 데이터베이스를 Push 및 Pulling 해 CKSyncEngine이 알아서 변경 사항을 기록한다.
  • 동기화 작업에서 변경 사항의 처리는 CKSyncEngineDelegate에 메서드로 유형별로 방출한다.
  • 각각 다른 도메인 영역에 다른 CKSyncEngine을 할당할 수 있다. ⇒ 단일 인스턴스일 필요가 없다는 의미

Why CKSyncEngine??

Dorocat 타이머 기록에 저장하기 위해서 사용함

 

Dorocat은 뽀모도로 타이머 앱으로 유저가 타이머로 Focus한 시간들을 기록하는 기능을 제공한다.

이 기록은 로컬 데이터로만 저장해 기기별로 각각 다른 기록들을 갖는다.

다른 기기에서도 현재 데이터를 연동할 필요가 있다고 느꼈다.

 

✅ 연동을 위한 서버 서비스 중 iCloud를 선택한 이유는 다음과 같다.

  1. Apple Platform에서 최적의 경험을 제공한다.
  2. 유저가 로그인 절차 등의 작업이 없이 간단하게 사용할 수 있어야한다.
  3. 서버 비용 부담이 되지 않아야한다. (= 무료…)

왜 CKSyncEngine을 사용했는가?

 

Deciding whether CloudKit is right for your app | Apple Developer Documentation

Explore the various options you have for using iCloud to store and sync your app’s data.

developer.apple.com

⇒ 어떤 CloudKit 기능을 제공하는 방법을 사용하는게 좋을지 알려주는 Apple Article

 

NSPersistentCloudKitContainer

가장 간편하고 잘 알려진 iCloud 데이터 연동 방법

CoreData의 엔티티를 CloudKit에 저장할 수 있게 제공하는 CoreData의 객체

원래 Dorocat도 이 인스턴스로 기존 CoreData Container 객체를 마이그레이션하는 전략을 적용하려고 함

But, 이 인스턴스를 사용하는 순간 CloudKit과 무조건 동기화가 된다. 유저가 로컬 데이터만 사용하고 싶어도 그럴 수 없다는 문제가 발생한다.

이 문제를 해결하기 위해선 다른 방법을 찾아야했다.

 

CKDatabase and CKOperation

말 그대로 CloudKit에 등록되어 있는 서버 정보를 가져올 수 있는 객체들

직접 데이터를 넣고 가져올 수 있다.

But, 모든 코드를 직접 작성해야하며 동기화 상태의 가용성을 위한 안전 장치가 없다.

 

가용성을 위한 안전장치

  • 시스템의 상황에 따라 늦게 데이터를 보내야 할 수 있다. (비행기 모드에선 데이터를 서버에 보낼 수 없다)
  • 다른 기기에서 동시에 특정 데이터를 변경할 수 있다. (어떤 값을 선택하든 모든 기기는 해당 데이터에 공통된 값을 갖도록 동기화가 이뤄저야 한다)

이로 인해, 작업 시간이 너무 오래 걸릴 것이 뻔했다.

 

✅ CKSyncEngine

  • 위의 개요에서 설명하듯 CKSyncEngine은 동기화의 안정성을 높여줄 수 있다.
  • 자동 동기화를 선택할 수 있어서 로컬 데이터만 유저가 기록하게 선택할 수 있다.

어떻게 작동하는가?

공식 문서 + WWDC

유저는 크게 Send 작업과 Fetch 작업을 할 수 있다.

  1. Send
    1. Sending 작업은 개발자가 직접 전송해야한다.
    2. Send시 데이터는 즉시 전송하지 않고 Pending 영역에서 시스템 상태를 파악하고 CloudKit에 전송한다.
  2. Fetch
    1. 개발자가 직접 메서드를 호출하거나 서버에서 값 변경시 Push Notification을 통해 전송하는 두 가지 방법으로 작동한다. ⇒ Push Notification을 위해 Background Mode를 켜야한다.
    2. Fetch한 데이터는 CKSyncEngineDelegate를 통해 전달받을 수 있다

정보를 보낼 때

✅ 위의 이미지에서 빨간색 숫자 부분만 개발자가 처리한다.

1. Add pending changes

  1. 새로 추가할 데이터가 있음을 CKSyncEngine에 등록
  2. 바로 Insert 하는게 아닌 키만 등록하는 개념

2. Get next change batch

  1. Application에 키 값을 보냄 → 실제 CloudKit에 등록할 데이터를 가져오라는 이벤트
  2. Application에서 매칭한 실제 데이터를 써서 CKSyncEngine에 전송

5. 에러 발생

  1. CloudKit 서버에서 등록한 데이터 관련해 문제가 생길시에 보내는 이벤트
  2. 중복 데이터 문제 / 해당 데이터의 엔티티(CloudKit에선 CKRecord) 등이 없는 문제에 전송함
  3. 추후 에러에 따른 처리 방법 포스팅 예정…

정보를 받을 때...

✅ 위의 이미지에서 빨간색 숫자 부분만 개발자가 처리한다.

1. Fetched Changes

  1. 가져온 CloudKit Entity (CKRecord) 값과 로컬 데이터 동기화 처리를 진행한다.

➕ CloudKit + CKSyncEngine 사용을 위한 XCode 기본 세팅

 

Enabling CloudKit in Your App | Apple Developer Documentation

Configure your app to store data in iCloud using CloudKit.

developer.apple.com

CloudKit에 컨테이너 등록하기

⇒ 각각의 앱이나 서비스에 사용하는 테이블들을 저장하기 위한 데이터베이스 공간

자동 Fetch를 위한 Push Notification 등록하기

댓글