Core Data with CloudKit: O que mudou?

Matheus Oliveira Costa
5 min readSep 27, 2019

--

Sempre vi o CloudKit como uma boa opção para desenvolvedores iOS compartilhar os dados de seus aplicativos nos dispositivos dos usuários. É um serviço que se adequa em muitos casos simples e até mesmo complexos, e é utilizado em muitas soluções da própria Apple. Mesmo assim, por diversos fatores, não é muito utilizado na comunidade de desenvolvedores.

No entanto, com essa atualização apresentada na WWDC 2019, acredito que o cenário muda um pouco e a opção de utilizar o CloudKit fica bem mais viável.

Portanto, nesse artigo apenas irei falar sobre a nova forma de integração apresentada na WWDC 2019 e disponível a partir do iOS 13. Não tratarei de tudo aqui, nem haverão exemplos de código, por isso ler a documentação sobre o assunto e assistir a Session 202 da WWDC 2019 é altamente recomendado.

Ok, vamos começar.

O que é isso de Core Data with CloudKit?

De maneira bem básica, é uma forma de compartilhar os dados de um aplicativo em todos os dispositivos de um usuário. De certa forma, a definição pode ser usada apenas para definir o que o CloudKit faz. No entanto, o diferencial é utilizar o Core Data para estruturar os dados salvos.

O Core Data em si, proporciona um modelo complexo e poderoso de gerenciamento de dados localmente, bem como é mais familiar aos desenvolvedores iOS em comparação ao modelo do CloudKit. Enquanto o CloudKit permite o compartilhamento dos dados entre todos os dispositivos conectados em uma conta do iCloud e serve como um serviço de backup.

Dessa forma, foi desenvolvido uma forma de replicar no CloudKit um modelo criado para o Core Data, para os dados serem salvos de forma remota.

Fluxo do funcionamento de forma simples (Fonte: Apple Documentation)

Quais as vantagens que ganho com isso?

A principal é sincronizar de forma fácil e rápida os dados privados dos usuários em todos os seus dispositivos. Se o aplicativo já utiliza o Core Data para persistência local, com poucos ajustes, é possível adicionar o suporte do CloudKit para compartilhar os dados.

Criar um modelo único para os dois propósitos. Antes era necessário fazer a lógica de sincronização entre os dois serviços e como cada um tinha uma estrutura diferente, de certa forma, não pode ser considerado um trabalho trivial. Agora, as modificações feitas no modelo local, já são refletidas em mudanças no modelo remoto de forma automática. Também acredito que o modelo de estruturação dos dados do Core Data seja bem mais "amigável" do que o padrão do CloudKit.

Outra vantagem é criar um backup remoto dos dados do usuário, prevenindo que sejam perdidos caso seja desinstalado o aplicativo ou o dispositivo seja perdido.

Sem falar das vantagens de utilizar o CloudKit:

  • O serviço é disponível por padrão para os desenvolvedores iOS, assim que cria um projeto já pode adicionar o suporte ao CloudKit, sem utilizar frameworks ou bibliotecas de terceiros;
  • É oferecido de "graça" pela Apple. Em produção, o CloudKit somente se torna pago em casos extremos, pois os recursos disponíveis aumentam proporcionalmente ao aumentar o número de usuários. E no caso específico do Core Data with CloudKit, nunca será pago pelo desenvolvedor, pois é utilizado a database privada, ou seja, utiliza o espaço no iCloud do usuário do aplicativo;
  • Compartilhar os dados entre plataformas Apple. Utilizando containers customizados, os dados salvos no CloudKit podem ser acessados por outros aplicativos do desenvolvedor, inclusive de outras plataformas Apple;
  • Mas, não é exclusivo das plataformas Apple. Obviamente, faz muito mais sentido utilizar somente no contexto Apple, no entanto existe o CloudKitJS que possibilita a manipulação da database num contexto mais geral (principalmente na Web);
  • Utiliza a conta do iCloud para autenticação do usuário. Dessa forma, o usuário possui toda a segurança e privacidade oferecida pela Apple.

Mas nada é perfeito,

A integração só funciona com databases privadas, ou seja, exclusivas da conta do iCloud cadastrada no dispositivo. Inclusive é criado uma zona customizada, que também só é possível em databases privadas;

Não é possível utilizar em containers já existentes. O Core Data precisa do controle total do modelo do CloudKit, pois ele quem cuida de todo o gerenciamento dos records. Se o aplicativo já usa CloudKit, só é possível sincronizar os dados se for criado um novo container;

Por último, existem algumas regras de como devem ser modelado os dados no Core Data para ser compatível com o CloudKit. São regras simples, mas deve ser prestado atenção de qualquer forma.

Links de referência (e próximos passos)

  1. Mirroring a Core Data Store with CloudKit: Artigo base da documentação completa de toda a integração Core Data with CloudKit.
  2. Setting Up Core Data with CloudKit: Explica os primeiros passos para configurar um novo projeto ou atualizar um já existente para utilizar a nova integração.
  3. Creating a Core Data Model for CloudKit: Explica como deve ser feito o modelo no Core Data para que seja compatível com o CloudKit e a integração funcione corretamente.
  4. Syncing a Core Data Store with CloudKit: Explica o fluxo de funcionamento, como é feito a criação, upload e download dos dados automaticamente pela integração. Por fim, explica assuntos mais complexos como debug de erros.
  5. Reading CloudKit Records for Core Data: Este é muito bom para entender como funciona o modelo criado no CloudKit pelo Core Data. É explicado como os CKRecord são criados a partir dos objetos do Core Data, relacionamentos, atributos utilizados etc.
  6. Using Core Data with CloudKit (WWDC 2019): Session da WWDC 2019 que apresenta a nova integração entre os dois serviços. Por incrível que pareça, é uma boa talk pois vai direto ao ponto e não fica dando rodeios para explicar uma coisa simples.
  7. Synchronizing a Local Store to the Cloud: Aqui pode fazer o download do projeto utilizado na talk acima.
  8. Making Apps with Core Data (WWDC 2019): Outra session da WWDC 2019, que é muito boa para entender o Core Data e algumas novidades com o iOS 13.

Para esse artigo, é isto. O objetivo aqui era somente explicar rápido do que se trata essa nova integração do Core Data com o CloudKit e porque, na minha opinião, é uma boa para os desenvolvedores iOS. Acredito que isso já é o necessário para engajar mais pessoas, mas caso queira se aprofundar nesse assunto, também escrevi outro artigo explicando de forma mais técnica e detalhada como funciona a integração.

E claro, feedbacks e comentários são muito bem vindos!

--

--