- Total
꿈꾸는리버리
[iCloudKit 시리즈 3] 나도 백엔드 있다 - Coredata -> iCloud로 변경하기 본문
🌷 iCloud 시리즈 목차
4) 여러 에러나 마주했던 문제 상황들 ...
CoreData에서 iCloudKit으로 변경하는 방법...
생각보다 너무 쉬워서 놀랬던 !!
본 포스팅은 Setting Up Core Data with CloudKit을 참고해서 작성했습니다 !
우선 프로젝트에 CoreData를 지원하고, 이를 이용해서 CRUD를 한 것은 이미 구현이 되어 있다고 가정하고 시작합니다. 만약 CoreData를 지원하려면 아래 링크를 확인해주세요.
🌷Core data를 iCloud로..!!
1️⃣ iCloud 활성화
2️⃣ Enable CloudKit and push notifications
아래와 같은 방법으로 iCloud를 추가한다. 만약 Capability에서 iCloud가 뜨지 않는다면 Xcode가 개발자 계정으로 열려있는지 확인하길 !
iCloud를 추가하고 나면 아래와 같이 iCloud 섹션이 생겨난다. 이때 Containers 영역에 Container를 추가하면 되는데 이때 만든 Container는 내가 만든 여러 앱들 사이에서 데이터 공유가 가능해진다! 그리고 이유는 모르겠으나, 한번 만든 Container는 삭제가 안된다고 하더라구요?? ( 숨기기는 가능 ) 그러니 test를 하더라도 이름 깔쌈하게 지으시길 바랍니다 ㅋㅋㅋ !
3️⃣ Enable Remote notifications in the background
CloudKit에서 경고, 소리, 배지와 같은 사용자 알림을 표시하지 않고도 새로운 콘텐츠가 있을 때 앱에 자동으로 알리려면 원격 알림 백그라운드 모드를 활성화해야 한다.
4️⃣ 기존 Xcode 프로젝트 업데이트
이미 Core Data를 사용하는 앱에 CloudKit을 사용하여 Core Data를 추가하려면 프로젝트 구성과 일부 코드를 수정해야 한다.
NSPersistentContainer로컬 영구 저장소만 지원하기 때문에 로컬 저장소를 CloudKit 데이터베이스에 동기화하는 기능을 추가하려면 NSPersistentContainerNSPersistentCloudKitContainer로 변경해야 한다.
init(inMemory: Bool = false) {
// container = NSPersistentContainer(name: "Earthquakes")
// -> NSPersistentContainer을 NSPersistentCloudKitContainer으로 변경
container = NSPersistentCloudKitContainer(name: "Earthquakes")
// 추가적으로 원한다면,
// NSMergeByPropertyObjectTrumpMergePolicy는 코어 데이터가 로컬, 클라우드 두 곳에서 관리 되므로 충돌이 일어날 경우 로컬의 값을 우선으로 하는 정책
container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
// 추가적으로 원한다면,
// automaticallyMergesChangesFromParent는 부모 컨텍스트의 변경사항을 자동으로 UI에 반영해주는 역할
container.viewContext.automaticallyMergesChangesFromParent = true
}
5️⃣ 여러 stores 관리
6️⃣ 모든 프로퍼티와 릴레이션은 optional이어야 한다.
7️⃣ 실 기기 2개로 확인하기
두 기기 모두 동일한 iCloud로 로그인이 되어 있어야 한다.
if ) 만약 cloudkit 다시 덜어내려면 NSPersistentHistoryTrackingKey 활성화를 다시 해야하기 때문에 코드를 아래와 같이 수정해야 한다.
class CoreDataManager {
static let instance = CoreDataManager()
let container: NSPersistentContainer
let context: NSManagedObjectContext
init() {
container = NSPersistentContainer(name: "TimelineContainer")
// Persistent Store Description 설정
if let description = container.persistentStoreDescriptions.first {
// NSPersistentHistoryTrackingKey 활성화
description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
// 마이그레이션 옵션 설정
let options: [String: Any] = [
NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true
]
}
container.loadPersistentStores { (description, error) in
if let error = error {
print("Error loading Core Data. \(error)")
}
}
context = container.viewContext
}
... 코드들
}
아니면 여기 Save 할 때 크래시 나요...
func save() {
do {
try context.save()
print("Saved successfully!")
} catch let error {
print("Error saving Core Data. \(error.localizedDescription)")
}
}
🌷 참고
+) iCloud 디버깅하는 방법
'오뚝이 개발자 > SwiftUI' 카테고리의 다른 글
[Error] SPM 설치 중 체크박스가 누락 -> 수동 삭제하기 (4) | 2024.10.04 |
---|---|
[iCloudKit 시리즈 4] 나도 백엔드 있다 - iCloud Noti 알아보기 (1) | 2024.10.01 |
[iCloudKit 시리즈 2.2] 나도 백엔드 있다 - 이미지, 비디오, 오디오 CRUD하기 (0) | 2024.10.01 |
[iCloudKit 시리즈 2.1] 나도 백엔드 있다 - iCloud CRUD 해보기 (1) | 2024.09.27 |
[iCloudKit 시리즈 1] 나도 백엔드 있다 - iCloud 세팅과 개념 그리고 유저 연결하기 (1) | 2024.09.27 |