Persistências básicas no iOS

Neste artigo condensamos as informações importantes e demonstramos os casos de uso específicos para cada ferramenta de persistência básica.

O que é persistência básica?

Antes de avançar no artigo é importante que você entenda que estamos considerando persistência básica as propriedades de aplicação. Ou seja:

  • Os dados consistem em pares chave-valor
  • Os dados são relativos à aplicação em vez de ser do usuário
  • Os dados não precisam de outros dados para serem úteis
  • É apenas necessária uma versão do dado

Para realizar esse tipo de persistência, existem algumas ferramentas usadas no IOS, sendo elas:

  • UserDefaults
  • File Manager
  • PropertyList
  • Keychain

Abaixo iremos explicar o que é cada uma dessas ferramentas, quando usar, que problemas elas demonstraram e também rápidas implementações.

1: UserDefaults

a. O que é?

  • Uma interface para banco de dados de preferencias do usuário, onde voce guarda pares de
  • chave-valor que persistem através de inicializações do seu app.

b. Quando usar

  • O User Defaults deve ser usado para armazenar preferências do usuário no aplicativo e para guardar o estado inicial de uma tela.
  • Por exemplo, guarda a velocidade de um player de vídeo:

c. Problemas (quando não usar)

  • Você não deve usar o User Defaults para armazenar informações sensíveis, objetos que representam o modelo da aplicação ou armazenar uma quantidade grande de informações.
  • Por exemplo, para salvar o token de push notification do device, o que pode não ser uma opção segura.Porque existe formas de conseguir acessar o arquivo de user defaults usando jailbreak, ou através de arquivos de backup.

d. Qual a diferença entre UserDefaultse Property List?

  • Em termos de tecnologia é a mesma coisa, ou seja, ambos são uma Property List e trabalha com o mesmo tipo de tecnologia, o que difere é como cada um deve ser usado, pois o UserDefaultsé carregado no momento que o aplicativo é iniciado, e a Property List só é carregada quando é requisitada.

e. O que é Application Group?

  • AppGroup permite diferentes aplicações (ou uma aplicação e uma extensão) de um mesmo bundle acessar um arquivo de localização compartilhada.
  • App groups podem ser usadas por:
  • Apple Watch settings
  • NSUserDefaults
  • Shared files

f. Como usar UserDefaultscom AppGroup?

Passo 1

  • O primeiro passo é habilitar o appGroup nas capabilities do app, e adicionar uma string
  • group.com.ramires (astring deve começar com group), essa string será vinculado ao seu Singin Certificate, logo toda aplicação que você vier a fazer com esse mesma conta terá acesso àessa string.
  • É importante deixar claro que os dados irão ficar disponíveis somente localmente.

Passo 2

  • Feito isso, você poderá ter acesso ao app group utilizando o user defaults da seguinte forma:

let userDefaults = UserDefaults(suiteName: "group.com.ramires")

  • Depois você pode usar os métodos normalmente do User Defaults, tanto para ler, quanto para gravar.

Passo 3

  • Habilite o User Defaults no outro app, e a string do grupo já estará disponível.
  • Exemplo completo:

g. Como armazenar URL’s de arquivos?

2: File Manager

a. O que é?

File Manager é uma classe que auxilia na persistência básica de dados no sistema de arquivos do iOS, com ela os aplicativos podem salvar arquivos (áudio,imagens,etc.) diretamente no sistema de arquivos. O File Manager é voltado para aplicativos que funcionam por conta própria, ou seja, não possui ligações com nenhum outro aplicativo, e impõe uma restrita guideline.

Para utilizar o File Manager, o sistema cria uma sandbox, que é uma estrutura de segurança para cada aplicativo, que nada mais é que um diretório que pode ser usado para armazenar dados no dispositivo. Essa estrutura é identificada por um Bundle e possui três pastas: Documents, Library e Temp. Cada aplicativo só pode interagir com o sandbox que ele recebeu, se a aplicação acessar dados no dispositivo que não está localizado em seu sandbox é necessário requerer o dado através da interface do sistema. Também é possível interagir com outros sandbox se pertencerem a mesma empresa de desenvolvimento, o que é chamado de AppGroup.

b. Quando usar:

É comumente utilizado para armazenar arquivos diretamente no dispositivo, utilizando a estrutura de segurança sandbox.

Se você deseja simplesmente gravar um string, a maneira mais simplificada é utilizando os métodos de instância e classe de String.

Agora, para salvar objetos customizados, você precisa converter em uma instância de NSData, usando a classe NSKeyedArchiver:

Segue as seguintes guidelines delimitadas pela Apple, em relação a como utilizar o File Manager.

1. Apenas documentos e outros dados gerados pelo usuário, ou que não podem ser recriados pela sua aplicação, devem ser armazenados no diretório <Application_Home>/Documents e será automaticamente feito um backup para o iCloud.

2. Dados que possam ser baixados novamente ou recuperados devem ser armazenados no diretório <Application_Home>/Library/Caches. Exemplos de arquivos que você deve colocar no diretório Caches incluem: arquivos cache de banco de dados e conteúdos baixáveis, como os utilizados em revistas, jornais e aplicações de Mapas.

3. Dados que são usados temporariamente devem ser armazenados no diretório <Application_Home>/tmp. Apesar desses arquivos não possuírem backup para o iCloud, lembre-se de excluí-los quando você tiver terminado de utilizar, para que assim, eles não consumam espaço no dispositivo do usuário.

4. Utilize a opção “não fazer backup” para arquivos específicos que devem permanecer no dispositivo mesmo em situações de pouco espaço disponível. Use essa opção com dados que podem ser recriados mas precisam persistir mesmo em situações de pouco espaço disponível, para funcionamento ideal do seu aplicativo ou porque os usuário esperam que esteja disponível mesmo utilizando offline. Essa opção funciona nos arquivos marcados sem importar qual diretório ele está, incluindo arquivos no diretório Documents. Esses arquivos não serão apagados e não serão incluídos no backup do iCloud ou iTunes do usuário. Pelo fato desses arquivos consumirem espaço no dispositivo do usuário, seu aplicativo tem a responsabilidade de monitorar e excluí-los periodicamente.

c. Problemas:

Alguns problemas podem ocorrer ao utilizar o File Manager, por exemplo:

Ao gravar arquivos na pasta Library, as vezes eles podem ser excluídos quando o dispositivo não tem espaço livre suficiente.

Ao gravar arquivos na pasta tmp, alguns deles podem ser deletados pelo sistema operacional quando o aplicativo não está executando.
Caso as guidelines não sejam seguidas, seu app será recusado para entrar na App Store, por isso é importante se atentar a como utilizar corretamente.

3: Property List

a. o que é?

  • Plist(Property List) é um padrão de arquivo arquivo xml usado nos sistemas iOS e Mac OS para guardar listas de propriedades de forma hierárquica. Suporta tipos de dados simples: booleans, numbers, strings, dates e raw byte data. E podem ser estruturados em array ou dictionary.
  • Suas vantagem é usar um padrão aberto amplamente usado e conhecido: XML. Portanto, é mais legível, sendo também abstraído pela interface do Xcode. Pois, este possui uma interface para edição de PLists bem simples. para criar uma plist basta selecionar a opção property list na janela de criação de arquivos do Xcode, em seguida dê o nome e salve. Ao abrir a plist o Xcode apresenta o conteúdo usando seu editor.
  • Todo projeto Xcode possui um arquivo padrão de configuração relativo ao sistema: Info.plist. Esse arquivo guarda informações sobre o projeto como nome, versão, permissões.

b. Quando usar?

  • As property lists são as formas recomendadas de se guardar propriedades do sistema e preferencias do usuário no iOS e Mac OS. Normalmente, são usadas quando voce quer armazenar poucos dados e que normalmente não mudam.
  • Exemplo:
  • Você pode usar uma plist para definir propriedades iniciais de um aplicativo. Ao invés de ter uma grande estrutura escrita em código, você tem uma estrutura desacoplada, mais legível, centralizada e reversível.
  • Exemplo:
  • Para popular um picker que tem valores estáticos. Ao invés de ter um array diretamente no código, você pode isolar esses dados em plists.

Gist Recuperando valores plist:

Gist setando valores no Datasource do Picker: https://gist.github.com/allymf/afde08327da3e9bc5485beecbb46e93f

c. problemas

  • PorpertyLists não são uma boa escolha quando se quer armazenar uma grande quantidade de dados, quando uma plist é lida, ela é carregada na memória em toda sua extensão, levando a lentidão em alguns casos.
  • Se voce quiser guarda pequenas costumizacoes do usuario, talvez o plist não seja a melhor maneira, o userdefaults provém uma camada de abstração e foi pensado para este fim.-
  • Plist não são tipos de armazenamentos seguros, portanto não guarde tokens, senhas ou outros dados críticos neles. Use Keychain ao invés disso.

4: Keychain

a. O que é?

Algumas vezes é necessário que o usuário insira “informações sensíveis” ou “segredos” e ou ter que ficar lembrando qual a senha e se forçar a escolher uma senha não tão complexa por causa da dificuldade de lembrar.

A API do keychain nos ajuda a resolver esse problema por implementar um mecanismo de guardar dados (de tamanho pequeno) em um banco criptografado chamado keychain. Podendo ate preencher a senha por eles e possibilita-los escolher uma senha mais complexa.

Keychain não esta limitada apenas a senhas como mostra a figura a baixo. Pode se usar também pra guardar informações sensíveis como dados de cartão de credito e também dados como certificados e chaves.

b. Vantagens de uso

Keychain é muito mais seguro que as outras opções que temos de armazenamento no iOS, como o UserDefaults que muitos desenvolvedores escolhem por sua simples implementação ou até mesmo soluções desenvolvidas pelo próprio desenvolvedor.

Como exemplo de utilização do Keychain temos a nova feature do iOS 12, que vem tornando mais simples a utilização de senhas fortes pelo usuário, utilizar senhas fortes tornou-se complexo quando temos muitas contas para recordar, o que a Apple visa fazer é automatizar a criação de senhas fortes para suas redes, e automatizar sempre que possível o login. Toda essa tarefa vai ser armazenada no Keychain, pois como é de se imaginar ela é extremamente sensível

c. Problemas e quando não usar Keychain

Utilizar o Keychain não é um mar de rosas, integrar-lo com seu aplicativo é bem complexo, para facilitar o trabalho do desenvolvedor a apple disponibiliza um Swift Wrapper chamado GenericKeychain, que prove uma interface mais amigável. Você também pode utilizar Cocoapods que abstraem bastante a complexidade de utilizar o Keychain, como por exemplo:

  • KeychainAccess
  • Keychains

Keychain foi criada para salvar “segredos”, por isso ao salvar há um processamento a mais de criptografia e de wrapper, por isso não é interessante usa-la para guardar qualquer tipo de dado.

Como o banco de dados da keychain é realizada como um Banco de Dados SQLite, então o tamanho máximo de string a ser guardada na keychain é o mesmo do SQLite.

d. Implementando o Keychain

Encontramos em pesquisas que há algumas maneiras de implementar um CRUD com keychain.

  • Keychain Wrapper
  • O wrapper é feito em C e por isso, para usar o wrapper, é necessário criar um header e implementar as funções.
  • Cocoapods
  • É preciso baixar e pesquisar a ferramenta que será usada em seu projeto.

Este artigo visa incentivar e facilitar o estudo de persistências no IOS, espero que tenhamos ajudado e agradecemos pela leitura.

Referências

O que é o Keychain?

Porque utilizar o Keychain?

iOS 12, provendo segurança para o usuário.

Documentação da Apple

Hacking With Swift

GitHub — Aplicativo Firefox

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html

https://matteomanferdini.com/which-storage-technologies-are-available-in-ios-and-which-ones-you-should-use/

https://matteomanferdini.com/how-to-persist-data-in-ios-apps-using-property-lists-and-the-correct-architecture-for-handling-persistent-storage/

https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html

--

--

Guilherme Araujo
Sanbox — Apple Developer Academy (IFCE)

Computer engineering student, chronicles & fantasies writer, comics lover. ~Pizza + code + spotify = I happy.~