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를 선택한 이유는 다음과 같다.
- Apple Platform에서 최적의 경험을 제공한다.
- 유저가 로그인 절차 등의 작업이 없이 간단하게 사용할 수 있어야한다.
- 서버 비용 부담이 되지 않아야한다. (= 무료…)
왜 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 작업을 할 수 있다.
- Send
- Sending 작업은 개발자가 직접 전송해야한다.
- Send시 데이터는 즉시 전송하지 않고 Pending 영역에서 시스템 상태를 파악하고 CloudKit에 전송한다.
- Fetch
- 개발자가 직접 메서드를 호출하거나 서버에서 값 변경시 Push Notification을 통해 전송하는 두 가지 방법으로 작동한다. ⇒ Push Notification을 위해 Background Mode를 켜야한다.
- Fetch한 데이터는
CKSyncEngineDelegate를 통해 전달받을 수 있다
정보를 보낼 때

✅ 위의 이미지에서 빨간색 숫자 부분만 개발자가 처리한다.
1. Add pending changes
- 새로 추가할 데이터가 있음을 CKSyncEngine에 등록
- 바로 Insert 하는게 아닌 키만 등록하는 개념
2. Get next change batch
- Application에 키 값을 보냄 → 실제 CloudKit에 등록할 데이터를 가져오라는 이벤트
- Application에서 매칭한 실제 데이터를 써서 CKSyncEngine에 전송
5. 에러 발생
- CloudKit 서버에서 등록한 데이터 관련해 문제가 생길시에 보내는 이벤트
- 중복 데이터 문제 / 해당 데이터의 엔티티(CloudKit에선 CKRecord) 등이 없는 문제에 전송함
- 추후 에러에 따른 처리 방법 포스팅 예정…
정보를 받을 때...

✅ 위의 이미지에서 빨간색 숫자 부분만 개발자가 처리한다.
1. Fetched Changes
- 가져온 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 등록하기
댓글