Introdução ao Firebase

Esse tutorial é voltado para aqueles que nunca utilizaram Firebase antes para desenvolvimento de um aplicativo iOS. Vamos explicar de uma forma simplificada o funcionamento do Firebase, assim como todos os requisitos para que possamos implementar o Firebase em nossa aplicação. Guiaremos você desde o início para que possa integrar corretamente seu app com o Firebase. Neste tutorial abordaremos a criação, configuração a uso básico desta ferramenta em conjunto com um aplicativo iOS em Swift.

Introdução ao Cocoa Pods

Cocoa Pods é um gerenciador de dependências externas para os nossos projetos. Utilizando esse gerenciador é possível colocar frameworks e bibliotecas externas como dependência do nosso projeto e o Cocoa Pods baixa e instala automaticamente as dependências no projeto.

Instalação e Setup do Cocoa Pods

O processo de instalação e setup do Cocoa Pods é bem simples que consiste em alguns passos:

Abra o terminal e execute o comando abaixo:
sudo gem install cocoapods
pod setup

Para mais informações acesse o site oficial.

Introdução ao Firebase

Firebase é uma estrutura de back-end que funciona como uma plataforma de desenvolvimento de aplicativos para dispositivos moveis que possibilita a implementação de aplicações utilizando varias funcionalidades online. Neste tutorial estaremos utilizando os recursos de DataBase e Authentication.
Para visualizar uma lista completa de todos os recursos do Firebase, clique neste link.

Criando uma conta

Para criar uma conta acesse o site e clique na opção “Fazer Login” como mostrado na tela abaixo:

A empresa Firebase foi adquirida pela Google em 2014 então você pode fazer login utilizando seu gmail.

Iniciando projeto no Xcode

Agora vamos finalmente criar o nosso projeto no Xcode. Primeiramente abra o xcode e clique “Create a new Xcode project”.

Selecione agora a opção “Single View Application” e clique em “Next”:

Para essa demonstração criamos um projeto com o nome de “App-Teste”, selecionamos a linguagem como “Swift”, selecionamos também “iPhone” na opção de dispositivos e não marcamos nenhum dos check box como na tela abaixo:

Criando projeto no Firebase

Nesse momento vamos voltar na pagina do firebase e clicar na opção “Ir para console” como mostrada na tela abaixo:

Na tela de console, clique em “Adicionar projeto” como mostrado na tela abaixo:

Digite o nome do seu projeto e seleciona sua região.
Depois de preencher corretamente os campos clique em “Criar Projeto”.

Apos criar seu projeto no Firebase clique na opção “Adicionar o Firebase ao seu aplicativo iOS”:

Nesse momento uma tela com um passo a passo de como adicionar o Firebase ira aparecer na sua tela, pedindo alguns dados. A primeiro coisa que ele pede é o “Código do pacote do iOS”, que é o “Bundle Identifier” do seu projeto no Xcode.
Voce pode encontrar esse código do “Bundle Identifier” aqui:

Copie o “Bundle Identifier” do seu projeto Xcode e cole no campo “Código do pacote do iOS” na pagina do passo a passo do Firebase:

Os outros dois campos são opcionais, o campo “Apelido do aplicativo” ficara disponível apenas para você visualizar o projeto e o “ID da App Store” é para o caso do aplicativo ja estar na App Store. 
Após preencher os dados devidamente clique em “Registrar App”, no passo 2 do processo, clique em “Fazer o download GoogleService-Info.plist“.

Apos baixar o arquivo GoogleService-Info.plist, arraste ele para o seu projeto do Xcode logo abaixo do arquivo Info.plist como mostra a tela abaixo:

Agora volte a tela do passo a passo no Firebase e clique em “Continuar”.

Instalando as dependências do Firebase no projeto

O proximo passo agora é instalar as dependências no seu projeto do Xcode. Para isso feche o seu projeto do Xcode e abra seu terminal, acesse a pasta do seu projeto e digite os seguintes comandos:

pod init

Apos a execução desse comando você pode ver que na pasta do seu projeto no Finder foi criado um novo arquivo, o Podfile como mostrado na tela abaixo:

Abra esse arquivo utilizando o Xcode e adicione as dependências abaixo:

pod ‘Firebase/Core’
pod ‘Firebase/Database’
pod ‘Firebase/Auth’

Essas são as dependências que usaremos no nosso projeto, se você tiver interesse em saber mais sobre as outras dependências referentes aos outros serviços do Firebase, acesse aqui.

Após adicionar as dependências salve o arquivo Podfile.

Depois de salvar o arquivo Podfile volte ao terminal e digite o comando abaixo:

pod install

Esse comando instala todas as dependências que foram descritas no arquivo Podfile, após executado esse comando vá na pasta do seu projeto e abra seu projeto com o final .xcworkspace.

Esse projeto com final .xcworkspace é o projeto que foi gerado durante o a execução do comando pod install que executamos no terminal. Repare que esse novo projeto com final .xcworkspace possui o ícone branco diferentemente do projeto anterior que estávamos utilizando. A partir de agora só iremos utilizar o arquivo com final de .xcworkspace.
Volte agora na tela do passo a passo do Firebase e clique em “Continuar”.
Nessa ultima etapa do processo vá ate o arquivo AppDelegate.swift no seu projeto, adicione a importação do Firebase e chame o método configure() dentro do método application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool, como mostra a tela abaixo:

Observe a importação do Firebase na linha 10 e a chamada do método .configure() na linha 19 partir do objeto FirebaseApp.
Nesse momento nosso projeto esta devidamente configurado para utilizar os recursos do Firebase que adicionamos, podemos agora clicar em “Finalizar” na tela de passo a passo do Firebase.

Importando o Firebase ao projeto

Para seguir com o tutorial, voce precisa de três importações do Firebase no seu arquivo ViewController.swift do seu projeto:

Se tudo foi feito corretamente ate agora voce pode executar o seu projeto e vai obter a mensagem “Firebase Analytics enabled” no console do Xcode.

Seu projeto ja esta funcionando com o Firebase ! :D

Configurando Autenticação do Firebase

Para cadastrar um novo usuário precisamos ir na nossa página do Firebase do projeto, entrar na opção “Authentication” no menu lateral esquerdo, e dentro da parte de “Authentication”, clique na aba “Método de login” como mostra a tela abaixo:

No nosso caso estaremos fazendo login partir de “E-mail/senha“, então clique sobre a opção de provedor “E-mail/senha“ e clique no switch para ativar o mesmo e depois clique em “Salvar”.

Cadastrando novo usuario

No nosso código para cadastrar um novo usuário utilizaremos o método .createUser() como no exemplo abaixo, note que a variável usuário esta servindo como uma referencia aos usuários cadastrados no banco, o objeto Auth é responsável por gerenciar as autenticações com o Firebase e o método .auth() retorna o objeto gerenciador de autenticação propriamente dito:

É interessante lembrar que quando o cadastro é realizado a sessão do usuário já é mantida, ou seja, o usuário cadastrado já fica automaticamente logado.
Se tudo aconteceu como esperado na sua aba de “Usuarios” no menu Firebase você ja poderá ver o seu novo usuário cadastrado, como mostra a imagem a seguir:

Deslogando usuario

Para fazer logout do usuário, usaremos a mesma variável usuario criada anteriormente, e vamos apenas chamar o método .signOut() que precisa ser colocado dentro de um try-catch para tratamento de possíveis erros.

Logando usuario

Para logar um usuário, usaremos a mesma variável usuario criada anteriormente, só que dessa vez chamaremos o método .signIn() passando o email e a senha do usuário, como mostra o código abaixo:

Introdução ao modelo de banco de dados noSQL

O banco de dados noSQL trabalha com uma alternativa aos sistemas convencionais de gerenciamento de banco de dados, utilizando uma árvore de nós de forma que eles fiquem organizados partir de um único nó raiz.
Para entender melhor a ideia do banco de dados noSQL e visualizar a diferença entre ele e o banco de dados SQL comum, vamos nos atentar as imagens a seguir.

O banco ao lado esquerdo é uma visão de como os dados são armazenados em um banco convencional usando SQL, enquanto que a imagem ao lado direito mostra como os mesmos dados seriam armazenados em um banco noSQL.
Note que o código do usuario no caso do noSQL se torna o nó pai dos atributos para cada um dos usuarios.

Criando referencia para o Database

Para utilizar o Database, é necessário criar uma referência ao banco, e é possível fazer isso adicionando apenas a seguinte linha de código ao seu projeto, dentro do viewDidLoad():

Essa será a referência ao nosso no raiz do nosso DataBase.

Configurando Database

Para poder inserir/alterar coisas no Database, por padrão é preciso estar logado, o nosso tutorial nós vamos utilizar o Database em sua configuração padrão por ser mais seguro aos usuários. Mas se você deseja permitir que usuários não logados alterem o Database, vá na aba de “Regras” dentro do seu Database e altere para true as regras de .read.write, como mostra a imagem abaixo:

Salvando dados no Database

Nesse momento já podemos inserir novos dados ao nosso Database utilizando a função .setValue() no nó especificado:

No exemplo criamos uma variável pontuacao que guarda uma referência ao nó pontuacaoque seria filho do nó raiz do Database e logo em seguida na linha 22 atribuímos o valor “500”.
Se tudo foi feito corretamente até agora na pagina do Database poderemos ver os nós que acabamos de adicionar, como mostra a imagem abaixo:

Recuperando dados do Database

Para recuperar dados do Database utilizaremos observers que funcionam como listeners do nosso Database. Para criar um Observer, precisamos primeiro referenciar um nó e partindo dele chamamos o método .observe() que recebe um DataEventType e um uma closure. Antes de prosseguirmos seria interessante dar uma olhada nos possíveis tipos de DataEventType:

No exemplo a seguir criamos um observer para a pontuação com um DataEventType.value que notifica qualquer das alterações de DataEventType possiveis e na closure, nós demos print na pontuação como mostra o trecho abaixo:

Excluindo dados no Database

Para remover um nó do Database utilizamos o método .removeValue() chamado partir do nó que queremos remover, como mostra o exemplo abaixo:

pontuacao.removeValue()