Lição: 98: CloudKit e Sincronização de Dados
Nesta aula, vamos explorar como usar o CloudKit para sincronizar dados entre dispositivos e o iCloud. O CloudKit é um framework oferecido pela Apple que permite armazenar dados no iCloud, tornando-os acessíveis em todos os dispositivos associados ao ID Apple de um usuário. Vamos abordar como configurar um contêiner do CloudKit, realizar operações básicas de CRUD (Criar, Ler, Atualizar e Deletar) e lidar com a sincronização de dados.
Pré-requisitos
Antes de prosseguir, certifique-se de que você tenha:
- O Xcode instalado (preferencialmente a versão mais recente).
- Uma conta de Desenvolvedor Apple ativa para configurar o CloudKit em seu aplicativo.
Configurando o CloudKit
-
Criar um Contêiner do CloudKit:
- Acesse o portal de Desenvolvedores da Apple e crie um novo identificador de aplicativo para seu app.
- Nas configurações do projeto no Xcode, habilite a capacidade 'iCloud' e marque 'CloudKit'.
-
Definir o Modelo de Dados:
- Abra o Painel do CloudKit e crie um tipo de registro. Por exemplo, vamos criar um tipo de registro chamado
Nota
com os seguintes campos:titulo
(String)conteudo
(String)dataDeCriacao
(Data)
- Abra o Painel do CloudKit e crie um tipo de registro. Por exemplo, vamos criar um tipo de registro chamado
Operações Básicas de CRUD
Configurando o Framework do CloudKit
Primeiro, importe o CloudKit no seu arquivo Swift.
import CloudKit
Criar (Inserir) um Registro
Para criar um novo registro no CloudKit, você pode usar o seguinte código:
func criarNota(titulo: String, conteudo: String) {
let registro = CKRecord(recordType: "Nota")
registro["titulo"] = titulo as CKRecordValue
registro["conteudo"] = conteudo as CKRecordValue
registro["dataDeCriacao"] = Date() as CKRecordValue
let bancoPublico = CKContainer.default().publicCloudDatabase
bancoPublico.save(registro) { (registroSalvo, erro) in
if let erro = erro {
print("Erro ao salvar registro: \(erro.localizedDescription)")
} else {
print("Registro salvo com sucesso: \(registroSalvo!)")
}
}
}
Ler (Buscar) Registros
Para buscar registros do CloudKit, você pode usar uma CKQuery
:
func buscarNotas() {
let consulta = CKQuery(recordType: "Nota", predicate: NSPredicate(value: true))
let bancoPublico = CKContainer.default().publicCloudDatabase
bancoPublico.perform(consulta, inZoneWith: nil) { (registros, erro) in
if let erro = erro {
print("Erro ao buscar registros: \(erro.localizedDescription)")
} else {
if let registros = registros {
for registro in registros {
let titulo = registro["titulo"] as? String ?? "Sem Título"
let conteudo = registro["conteudo"] as? String ?? "Sem Conteúdo"
let dataDeCriacao = registro["dataDeCriacao"] as? Date ?? Date()
print("Título: \(titulo), Conteúdo: \(conteudo), Data: \(dataDeCriacao)")
}
}
}
}
}
Atualizar um Registro
Para atualizar um registro existente, você precisa buscá-lo primeiro e depois salvar as alterações:
func atualizarNota(recordID: CKRecord.ID, novoTitulo: String, novoConteudo: String) {
let bancoPublico = CKContainer.default().publicCloudDatabase
bancoPublico.fetch(withRecordID: recordID) { (registro, erro) in
if let erro = erro {
print("Erro ao buscar registro: \(erro.localizedDescription)")
return
}
guard let registroParaAtualizar = registro else { return }
registroParaAtualizar["titulo"] = novoTitulo as CKRecordValue
registroParaAtualizar["conteudo"] = novoConteudo as CKRecordValue
bancoPublico.save(registroParaAtualizar) { (registroSalvo, erro) in
if let erro = erro {
print("Erro ao atualizar registro: \(erro.localizedDescription)")
} else {
print("Registro atualizado com sucesso: \(registroSalvo!)")
}
}
}
}
Deletar um Registro
Para deletar um registro, você pode usar o seguinte método:
func deletarNota(recordID: CKRecord.ID) {
let bancoPublico = CKContainer.default().publicCloudDatabase
bancoPublico.delete(withRecordID: recordID) { (recordID, erro) in
if let erro = erro {
print("Erro ao deletar registro: \(erro.localizedDescription)")
} else {
print("Registro deletado com sucesso: \(recordID!)")
}
}
}
Lidando com a Sincronização de Dados
O CloudKit proporciona sincronização automática entre dispositivos. Quando os dados são modificados ou adicionados através de qualquer dispositivo utilizando a mesma conta do iCloud, as alterações são refletidas em todos os dispositivos.
Observando Mudanças nos Dados
Para observar mudanças no seu banco de dados do CloudKit, você pode usar o CKQuerySubscription
. Isso ajuda a manter seu aplicativo atualizado com dados em tempo real.
func seInscreverNasNotas() {
let bancoPublico = CKContainer.default().publicCloudDatabase
let predicado = NSPredicate(value: true)
let inscricao = CKQuerySubscription(recordType: "Nota", predicate: predicado, options: .firesOnRecordCreation)
let infoNotificacao = CKSubscription.NotificationInfo()
infoNotificacao.alertBody = "Uma nova nota foi adicionada!"
infoNotificacao.soundName = "default"
inscricao.notificationInfo = infoNotificacao
bancoPublico.save(inscricao) { (inscricao, erro) in
if let erro = erro {
print("Erro ao se inscrever nas notas: \(erro.localizedDescription)")
} else {
print("Inscrição nas notas realizada com sucesso!")
}
}
}
Conclusão
Nesta aula, cobrimos o básico do uso do CloudKit para sincronização de dados em aplicativos Swift. Examinamos como realizar operações CRUD e observar mudanças em tempo real usando assinaturas. O CloudKit oferece uma maneira poderosa de gerenciar dados em um ambiente baseado em nuvem, garantindo que os usuários tenham acesso contínuo aos seus dados em todos os dispositivos.
Lembre-se de tratar erros de forma eficaz e testar sua implementação minuciosamente para garantir um aplicativo robusto!