SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
21.11.2024

Aula 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

  1. 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'.
  2. 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)

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!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!