4T2F / ThinkBig

🌟씽크빅 스터디🌟
5 stars 1 forks source link

iCloud와 Core Data의 통합을 구현할 때 어떤 도전 과제에 직면했고, 이를 어떻게 해결하셨나요? #25

Open xohxe opened 9 months ago

xohxe commented 9 months ago
xohxe commented 9 months ago

iCloud + CoreData를 통합해보자.

현업에서 CoreData, CloudKit 사용빈도가 낮다고하지만, 1st-party 프레임워크를 사용하면서 누릴 수 있는 공식지원이라는 안정적인 개발환경이나 간단한 코드로 iOS는 물론이고 iPadOS, MacOS, watchOS 까지 폭넓은 애플 생태계에서 동시에 개발이 가능하다는 장점은 다른 어떤 프레임워크에서도 찾을 수 없는 독보적인 기능이다.

특히 생산성앱 분야에서는 대표적으로 마크다운 기반의 노트앱 bear 이나, iPad 필기앱 최강자 goodnotes 역시 iCloud와 Core Data를 적극적으로 활용하고 있다.

이번에 CloudKit, CoreData 를 활용해, 링크를 저장하는 앱을 만들어보면서, 개인적으로 느낀 iCloud 통합을 통해 얻은 사용자 경험상의 이점은 아래와 같다.

1 . 먼저 프로젝트 설정해보자.

(* 단, Apple Developer 계정이 있어야 가능하다.) 먼저 통합과정 중 충돌을 방지하기 위해, 프로젝트 생성시 아래 두 가지에 체크하고 시작하자.

스크린샷 2024-01-16 오후 11 27 55

그리고 Signing & Capabilities에 가면, 자동으로 Background Modes와 iCloud가 활성화된 것을 볼 수 있을 것이다.

스크린샷 2024-01-16 오후 11 30 37

만약 프로젝트 생성시 두 부분을 체크하지 못했다면, 이 두 가지를 Capability에서 추가시켜주자. 기존에 NSPersistentContainer를 사용했던 곳을 NSPersistentCloudKitContainer로 변경한다.

그 다음 Container에서 + 버튼을 눌러서 새 컨테이너를 추가시켜줍시다. 컨테이너를 만들고 나면, 삭제하거나 이름을 변경할 수 없으니 주의해야한다!

2. CloudKit과 잘 호환 가능한 CoreData model 을 만들자.

Apple Developer Docs | CloudKit 데이터Model

그리고 iCloud와 CoreData 데이터 통합을 위해서는 CloudKit과 잘 호환 가능한 CoreData model을 만들어야 한다.

이는 CloudKit이 Core Data Model의 모든 특징들을 지원하지 않기 때문인데, 이러한 제한을 인지하고 호환 가능한 Core Data model을 만들어야 한다.

그럼 특징들을 정리하자면 다음과 같다.

  1. Entities에서 Unique constraint를 지원하지 않는다.
스크린샷 2024-01-16 오후 10 52 55
  1. Attributes에서 UndefinedobjectID attribute 타입을 지원하지 않는다. 

    스크린샷 2024-01-16 오후 10 18 35
  2. 모든 Relationship옵셔널이어야 한다.  

    • 또한 inverse를 가져야 한다.
    • Deletion rule: Deny를 지원하지 않는다. 
  3. Configurations에서는 특정 configuration에 있는 Entity들의 relationship은 다른 configuration에 있는 entity와 relationship을 가지면 안 된다.

3 . 그럼 동기화를 진행해볼까?

Apple Developer Docs | CloudKit과 CoreData 동기화

3-1. 로컬에서 변화가 발생했을 때

사용자가 한 장치에서 변경 사항을 적용하면 Core Data는 변경 사항을 사용자의 다른 장치로 보내기 전에 CloudKit에 업로드한다.

백그라운드에서 NSmanagedObjectCKRecord로 변환해주고 CloudKit에 전달해준다.

3-2. CloudKit에서 변화가 발생했을 때,

CloudKit은 변경 사항을 수신하여 CloudKit 저장소에 저장한 후 사용자의 다른 장치에 변경 사항을 알린다.

첫째, CloudKit은 사용자 계정의 다른 장치에 정기적으로 push notification을 보낸다. 그런 다음 각 장치에서 시스템은 마지막 가져오기 이후 변경된 모든 Recored를 다운로드하고 이를 인스턴스NSManagedObject 로 변환하는 백그라운드 작업을 생성한다. 마지막으로 Core Data는 이러한 관리 개체를 로컬 저장소에 저장한다.

4. 마지막으로..

아직 다양한 통합과정을 경험해보지 못해, 데이터충돌을 경험한 적은 없지만, 공식문서에 Debug 방법이 있어 첨부한다.

4-1. CloudKit을 사용하여 핵심 데이터의 오류 디버그

네트워크 오류나 사용자의 로그인 실패로 인해 발생하는 오류와 같은 대부분의 오류는 일시적이며 조치가 필요하지 않다. CloudKit을 사용하는 핵심 데이터가 시스템 로그에 기록하는 세부 정보 수준을 선택할 수 있다.

제품 > 구성표 > 구성표 편집을 선택한 후, 실행과 같은 작업을 선택하고 인수 탭을 선택한다. 디버그 수준 값과 함께 사용자 기본 설정을 애플리케이션에 com.apple.CoreData.CloudKitDebug인수로 전달한다.