Migrações leves e sincronização com CloudKit
Migre alterações de esquema e ative a sincronização com CloudKit usando NSPersistentCloudKitContainer.
Migrações leves e sincronização com CloudKit é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.
Por que fazer migrações?
Quando você altera seu modelo do Core Data ou do SwiftData (adicionando, renomeando ou removendo atributos), precisa migrar os armazenamentos existentes.
// Without migration, app crashes on launch:
// "The model used to open the store is incompatible with the one used to create the store"Migração leve no Core Data
O Core Data pode inferir automaticamente migrações simples (adicionar, renomear ou remover atributos) sem um modelo de mapeamento.
let desc = NSPersistentStoreDescription(url: storeURL)
desc.shouldMigrateStoreAutomatically = true
desc.shouldInferMappingModelAutomatically = true
container.persistentStoreDescriptions = [desc]Histórico de versões no .xcdatamodeld
Crie uma nova versão do modelo no Xcode: Editor → Adicionar versão do modelo. Defina a versão atual como a nova versão.
// In MyModel.xcdatamodeld:
// ├── MyModel.xcdatamodel (v1 - old)
// └── MyModel 2.xcdatamodel (v2 - current)
// Set current version to v2 in File InspectorVersionamento de esquema no SwiftData
Use VersionedSchema e SchemaMigrationPlan para gerenciar as versões do modelo 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
Defina etapas de migração entre versões em um SchemaMigrationPlan para orientar o SwiftData durante as atualizações.
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)
}Etapa de migração personalizada
Para migrações complexas (transformações de dados), use uma etapa .custom com closures willMigrate e didMigrate.
static let migrateV1toV2 = MigrationStage.custom(
fromVersion: AppSchemaV1.self,
toVersion: AppSchemaV2.self,
willMigrate: { context in
// transform old data
},
didMigrate: nil
)NSPersistentCloudKitContainer
Substitua NSPersistentContainer por NSPersistentCloudKitContainer para ativar a sincronização com o CloudKit.
let container = NSPersistentCloudKitContainer(name: "MyModel")
container.loadPersistentStores { _, error in
if let error { fatalError("\(error)") }
}
container.viewContext.automaticallyMergesChangesFromParent = trueRequisitos do CloudKit
A sincronização com o CloudKit exige: uma conta do iCloud conectada, a autorização do CloudKit e um contêiner do CloudKit configurado no portal do desenvolvedor.
// Xcode: Signing & Capabilities → + → iCloud → CloudKit
// Enable "Use CloudKit" in Core Data model inspectorSwiftData com CloudKit
Passe um ModelConfiguration com cloudKitDatabase para ativar a sincronização com o CloudKit no SwiftData.
let config = ModelConfiguration(
schema: schema,
cloudKitDatabase: .automatic
)
let container = try ModelContainer(for: schema, configurations: config)Lidando com conflitos de sincronização
O Core Data CloudKit resolve conflitos usando uma política de último registro vencedor. Projete os modelos para minimizar a contenção causada por gravações concorrentes.
// Best practice: keep models granular
// One attribute per write concern
// Avoid large blobs that frequently changeTestando migrações
Teste as migrações em uma cópia do armazenamento de produção antes de distribuir o app, para detectar problemas antes que afetem os usuários.
// Copy production store to a temp location
// Load it with the new container and verify objects are intactMonitorando migrações
Observe as notificações de migração do Core Data para mostrar a interface de progresso durante migrações longas.
NotificationCenter.default.addObserver(
forName: .NSPersistentStoreCoordinatorStoresWillChange,
object: container.persistentStoreCoordinator,
queue: .main
) { _ in showMigrationProgress() }Verificação rápida
Qual subclasse de NSPersistentContainer ativa a sincronização automática com o CloudKit?
Recapitulação da lição
Ative a migração leve com shouldMigrateStoreAutomatically para alterações simples. Use VersionedSchema + SchemaMigrationPlan no SwiftData. Ative a sincronização com o CloudKit substituindo o contêiner por NSPersistentCloudKitContainer ou usando ModelConfiguration(cloudKitDatabase: .automatic).
Perguntas Frequentes
A aula “Migrações leves e sincronização com CloudKit” é grátis?
Sim — o texto completo de “Migrações leves e sincronização com CloudKit” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.
O que vou aprender em “Migrações leves e sincronização com CloudKit”?
Migre alterações de esquema e ative a sincronização com CloudKit usando NSPersistentCloudKitContainer. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Migrações leves e sincronização com CloudKit”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Pilha do Core Data: configuração de NSPersistentContainer
- SwiftData @Model e ModelContext
- Relacionamentos e Fetch Descriptors
- Migrações leves e sincronização com CloudKit