Section 13/181 menit

13. CloudKit Sync

13. CloudKit Sync

SwiftData mendukung sinkronisasi otomatis dengan CloudKit Private Database dengan konfigurasi minimal.

swift
// Aktifkan CloudKit sync
let cloudConfig = ModelConfiguration(
    schema: Schema([Book.self, Author.self]),
    cloudKitDatabase: .automatic   // gunakan default container dari entitlements
)

// Atau dengan container ID eksplisit
let cloudConfig2 = ModelConfiguration(
    schema: Schema([Book.self]),
    cloudKitDatabase: .private("iCloud.com.yourcompany.yourapp")
)

let container = try ModelContainer(
    for: Schema([Book.self, Author.self]),
    configurations: cloudConfig
)

Syarat Model untuk CloudKit

CloudKit memiliki batasan yang membuat beberapa konfigurasi SwiftData tidak kompatibel:

swift
// ❌ CloudKit tidak mendukung unique constraints
@Model final class User {
    @Attribute(.unique) var email: String  // error saat runtime dengan CloudKit
}

// ❌ CloudKit tidak mendukung relasi dengan deleteRule .deny
@Relationship(deleteRule: .deny) var items: [Item]

// ✓ Semua properti harus opsional atau punya default untuk CloudKit
@Model final class CloudBook {
    var title: String = ""              // default value
    var author: String = ""
    var isRead: Bool = false
    var addedAt: Date = Date()
    var coverImageData: Data?           // optional untuk gambar besar

    init(title: String, author: String) {
        self.title = title
        self.author = author
    }
}