0Pricing
Swift Academy · Lekcja

Lekkie migracje i synchronizacja z CloudKit

Migrowanie zmian schematu i włączanie synchronizacji z CloudKit za pomocą NSPersistentCloudKitContainer.

Lekkie migracje i synchronizacja z CloudKit to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Dlaczego migracje?

Po zmianie modelu Core Data lub SwiftData (dodaniu, zmianie nazwy albo usunięciu atrybutów) należy przeprowadzić migrację istniejących magazynów.

// Without migration, app crashes on launch:
// "The model used to open the store is incompatible with the one used to create the store"

Lekka migracja w Core Data

Core Data może automatycznie wywnioskować proste migracje (dodanie, zmiana nazwy lub usunięcie atrybutu) bez modelu mapowania.

let desc = NSPersistentStoreDescription(url: storeURL)
desc.shouldMigrateStoreAutomatically = true
desc.shouldInferMappingModelAutomatically = true
container.persistentStoreDescriptions = [desc]

Historia wersji w .xcdatamodeld

W Xcode należy utworzyć nową wersję modelu: Editor → Add Model Version. Następnie należy ustawić ją jako bieżącą wersję.

// In MyModel.xcdatamodeld:
// ├── MyModel.xcdatamodel  (v1 - old)
// └── MyModel 2.xcdatamodel (v2 - current)
// Set current version to v2 in File Inspector

Wersjonowanie schematu SwiftData

Należy użyć VersionedSchema i SchemaMigrationPlan, aby zarządzać wersjami modeli SwiftData.

enum AppSchemaV1: VersionedSchema {
  static var versionIdentifier = Schema.Version(1,0,0)
  static var models: [any PersistentModel.Type] { [ItemV1.self] }
  @Model final class ItemV1 { var name: String; init(name: String) { self.name = name } }
}

SchemaMigrationPlan

W SchemaMigrationPlan należy zdefiniować etapy migracji między wersjami, aby wskazać SwiftData sposób przeprowadzania uaktualnień.

enum AppMigrationPlan: SchemaMigrationPlan {
  static var schemas: [any VersionedSchema.Type] { [AppSchemaV1.self, AppSchemaV2.self] }
  static var stages: [MigrationStage] { [migrateV1toV2] }
  static let migrateV1toV2 = MigrationStage.lightweight(fromVersion: AppSchemaV1.self, toVersion: AppSchemaV2.self)
}

Niestandardowy etap migracji

W przypadku złożonych migracji (transformacji danych) należy użyć etapu .custom z domknięciami willMigrate i didMigrate.

static let migrateV1toV2 = MigrationStage.custom(
  fromVersion: AppSchemaV1.self,
  toVersion: AppSchemaV2.self,
  willMigrate: { context in
    // transform old data
  },
  didMigrate: nil
)

NSPersistentCloudKitContainer

Należy zastąpić NSPersistentContainer typem NSPersistentCloudKitContainer, aby włączyć synchronizację z CloudKit.

let container = NSPersistentCloudKitContainer(name: "MyModel")
container.loadPersistentStores { _, error in
  if let error { fatalError("\(error)") }
}
container.viewContext.automaticallyMergesChangesFromParent = true

Wymagania CloudKit

Synchronizacja z CloudKit wymaga zalogowanego konta iCloud, uprawnienia CloudKit oraz kontenera CloudKit skonfigurowanego w portalu deweloperskim.

// Xcode: Signing & Capabilities → + → iCloud → CloudKit
// Enable "Use CloudKit" in Core Data model inspector

SwiftData z CloudKit

Należy przekazać ModelConfiguration z cloudKitDatabase, aby włączyć synchronizację SwiftData z CloudKit.

let config = ModelConfiguration(
  schema: schema,
  cloudKitDatabase: .automatic
)
let container = try ModelContainer(for: schema, configurations: config)

Obsługa konfliktów synchronizacji

Core Data CloudKit rozwiązuje konflikty zgodnie z zasadą wygrywa ostatni zapis. Modele należy projektować tak, aby ograniczyć ryzyko równoczesnych zapisów.

// Best practice: keep models granular
// One attribute per write concern
// Avoid large blobs that frequently change

Testowanie migracji

Przed wydaniem należy przetestować migracje na kopii magazynu produkcyjnego, aby wykryć problemy zanim dotkną użytkowników.

// Copy production store to a temp location
// Load it with the new container and verify objects are intact

Monitorowanie migracji

Podczas długich migracji należy nasłuchiwać powiadomień Core Data o migracji, aby wyświetlać interfejs postępu.

NotificationCenter.default.addObserver(
  forName: .NSPersistentStoreCoordinatorStoresWillChange,
  object: container.persistentStoreCoordinator,
  queue: .main
) { _ in showMigrationProgress() }

Szybkie sprawdzenie

Która podklasa NSPersistentContainer umożliwia automatyczną synchronizację z CloudKit?

Podsumowanie lekcji

W przypadku prostych zmian należy włączyć lekką migrację za pomocą shouldMigrateStoreAutomatically. W SwiftData należy używać VersionedSchema i SchemaMigrationPlan. Synchronizację z CloudKit można włączyć, zastępując typ kontenera przez NSPersistentCloudKitContainer lub używając ModelConfiguration(cloudKitDatabase: .automatic).

Często zadawane pytania

Czy lekcja „Lekkie migracje i synchronizacja z CloudKit” jest bezpłatna?

Tak — pełny tekst „Lekkie migracje i synchronizacja z CloudKit” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Lekkie migracje i synchronizacja z CloudKit”?

Migrowanie zmian schematu i włączanie synchronizacji z CloudKit za pomocą NSPersistentCloudKitContainer. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Lekkie migracje i synchronizacja z CloudKit”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Stos Core Data: konfiguracja NSPersistentContainer
  2. SwiftData @Model i ModelContext
  3. Relacje i deskryptory pobierania
  4. Lekkie migracje i synchronizacja z CloudKit
← Powrót do Swift Academy