Compatibile con Xcode 8

Autenticazione con Firebase e linguaggio Swift | Classica e con Social

ENTRA NEL NOSTRO GRUPPO FACEBOOK

Se già ti sei innamorato di Firebase e del suo Database Realtime, sono più che sicuro che apprezzerai la bellezza e semplicità della gestione dell’autenticazione con Firebase e linguaggio Swift (Social e classica).

L’autenticazione dei tuoi utenti ti permetterà di poter gestire meglio i dati che ognuno di essi creerà. Non devi vederlo solamente come il sistema che permette di eseguire il login nell’applicazione, bensì come qualcosa di più esteso e articolato.

Partiamo dal presupposto che l’autenticazione degli utenti non è ben vista dal grande pubblico. Il perché è abbastanza semplice. Fa perdere tempo a chi di tempo non ne ha.

Quindi, perché è importante e quand’è necessario utilizzare l’autenticazione con Firebase e linguaggio Swift?

  1. Uno dei motivi te l’ho spiegato poc’anzi. Utilizzando le credenziali dell’utente, come l’username univoco o l’email, riesci ad archiviare meglio le informazioni generate da un utente. Per esempio, se un utente vuole conservare sul cloud la propria lista della spesa per utilizzarla da diversi dispositivi o per condividerla.
  2. Creare un social network. La stragrande maggioranza delle applicazioni sono create con lo scopo di mettere in relazione gli utenti tra loro. Anche i giochi sono un esempio con le loro classifiche o la possibilità di creare delle partite multiplayer.
  3. Statistiche, consumi e abitudini degli utenti. Molte applicazioni conservano le informazioni sull’utilizzo dell’applicazione. Per esempio nelle applicazioni di e-commerce, dove già l’autenticazione è utilizzata per la gestione degli acquisti, permette di sapere quali prodotti vengono acquistati, osservati e quant’altro.

Di seguito un esempio dell’applicazione realizzata a fine tutorial.

Motivi per creare un sistema di login online per la tua applicazione ne esistono a migliaia. In base alla tipologia di progetto, spetterà a te decidere quale sistema di autenticazione implementare.

Dico che spetterà a te perché in base alla tipologia d’applicazione che hai in mente, potrà essere necessario utilizzare una forma d’autenticazione rispetto ad un’altra.

Per il discorso fatto all’inizio, dove l’utente non ama i passaggi obbligatori o perdere tempo, l’autenticazione può impattare drasticamente sulla riuscita del tuo progetto.

Autenticazione con username/password o con Social Network come Facebook e Twitter?

Qui entrano in gioco argomenti che sfiorano e toccano appieno il Marketing delle applicazioni. Lo studio del mercato di riferimento è alla base delle scelta che ti spingerà a scegliere un sistema o un altro.

Se la tua applicazione è per una fascia d’età giovane è molto probabile che questi preferiscano utilizzare il login tramite Social Network. Facebook, Google o Twitter? Facebook è ovviamente il più gettonato ma, se per esempio siete sviluppatori Android, sapete benissimo che dovete dare rilevanza al Google Login dato che gli utenti Android hanno già un account Google.

Se invece la tua applicazione riguarda una fascia di utenti adulti o che non usa il Social (può anche essere che non volete far utilizzare i Social per questioni di privacy) allora è più scontato andare verso un’implementazione di login classica (con username, email e password).

La cosa positiva è che con Firebase potrai gestire tutti i sistemi di autenticazione, con Social e Non, indifferente dal tipo di progetto che stai sviluppando. Se ti renderai conto che ai tuoi utenti serve l’autenticazione con Facebook allora potrai aggiungerla successivamente e, ovviamente, collegare l’account esistente a quello social.

Fatta questa piccola premessa, sei pronto ad implementare l’autenticazione con Firebase e linguaggio Swift?

Il progetto di partenza

Per poter velocizzare tutto il tutorial, ho preparato un piccolo progetto di partenza che puoi scaricare dal link qui sotto. Il download non è obbligatorio e se vuoi puoi seguire il tutorial creando un tuo personale progetto.

Clicca il link di seguito per scaricare il progetto di partenza -> Download Da DropBox.

firebase auth login iOS

Lo Starter Kit è compatibile con Xcode 8.x ed il linguaggio Swift 3.0. Se stai ancora sviluppando con Xcode 7, questo progetto non sarà compatibile e dovrai ricrearlo da zero.

In fondo alla pagina troverai il download al progetto completo.

[su_spoiler title=”La struttura ed il contenuto dei file” style=”fancy”]

Il progetto presenta 3 ViewController principali. Prenditi due minuti per controllare la struttura dei file:

  1. LoginViewController: Qui l’utente eseguirà il login utilizzando l’email e la password. Se il login avverrà con successo, dove che sarà stato premuto il bottone “Login withEmail” (collegato alla IBAction classicLogin_clicked) verrà invocato il segue “segueToHome” che porterà a HomeViewController. Il bottone “New? Signup now!” invoca il segue “segueToSignup” che porterà a SignupViewController.
  2. SignupViewController: Qui l’utente potrà registrare un nuovo account una volta che avrà cliccato su “Signup Now” (a cui è collegata la IBAction signup_clicked). A login avvenuto verrà portato a HomeViewController con l’invocazione dell’omonimo segue. Si può tornare indietro al LoginViewController con il bottone “Back to Login”.
  3. HomeViewController: Se l’utente avrà registrato un nuovo account o avrà eseguito il login, verrà rimandato qui.

All’interno del file ErrorMessageView è presente una struttura che ci servirà a creare un AlertViewController per comunicare all’utente gli eventuali problemi di login o registrazione.

[/su_spoiler]

Questi sono alcuni link utili alla comprensione di questo tutorial:

Cocoapod e Firebase

Prima di cominciare a mettere le mani al codice, devi settare correttamente sia il mio progetto che il tuo. Segui tutti i passaggi per l’integrazione di Firebase con la tua applicazione iOS.

  1. Crea una nuova applicazione su firebase.google.com (puoi anche utilizzarne una esistente).
  2. Aggiungi il Bundle Identifier della tua app iOS all’applicazione su Firebase.
  3. Scarica il file GoogleService-info.plist ed importalo dentro il progetto di Xcode.

Apri il terminale ed inizializza il progetto per poter integrare correttamente i framework di Firebase (prima il cd PercorsoCartella e successivamente “pod init”). Ho spiegato tutti i passaggi nel tutorial precedente.

Dato che integreremo autenticazione e database realtime, devi aggiungere i relativi framework. Quindi, vai nella cartella del progetto, apri il file Podfile ed inserisci il seguente testo:

Successivamente, dal terminale, esegui il “pod install”. Una volta completato il processo, apri il progetto utilizzando il file nomeProgetto.xworkspace

Se stai passando da Xcode 7 alla versione 8, ricordati di passare il il platform: ios, ‘versione’, in 10.0. Una volta fatto questo, fai un “pod update” per aggiornare i vari framework (eseguilo periodicamente per avere tutto all’ultima versione).

Infine, spostati nell’AppDelegate.swift, aggiungi l’import Firebase:

Nel metodo finishLaunchingWithOptions, aggiungi il seguente codice. Questo aprirà la connessione con la tua applicazione su Firebase (ricordati di importare il file GoogleService-info.plist su Xcode):

Impostazioni autenticazione su Firebase

Di default, tutte le applicazioni Firebase non permettono di autenticare gli utenti. Ogni singolo modulo d’autenticazione (Email, Facebook, Google ecc) deve essere abilitato manualmente. L’abilitazione di un sistema di Sign-In ti permetterà di utilizzare il framework FirebaseAuth importato poc’anzi.

Vai sulla console di Firebase ed entra dentro la tua applicazione. Spostati nel menu Auth:

Firebase auth pannello console

Nel pannello:

  • USERS: Vedrai la lista dei vari utenti loggati nell’applicazione. Il massimo di utenti visualizzati sarà 500, il resto li dovrai cercare manualmente.
  • SIGN-IN METHOD: Qui potrai abilitare o disabilitare i vari sistemi di autenticazione. Di default sono tutti disabilitati. In fondo alla pagina ci sono i link di OAuth nel caso utilizzi un sistema diverso, o un server, rispetto a quelli elencati. E ancor più sotto c’è un pannello che ti permette di abilitare la creazione di più account per la stessa email. Di default gli utenti potranno creare un solo account per email.
  • EMAIL TEMPLATES: Puoi modificare la forma ed il testo delle email di sistema. Per esempio, se vorrai modificare l’email per la conferma dell’email o per il reset della password, potrai farlo da qui.

Comincia abilitando la registrazione con Email e Password:

Autenticazione con email e password con firebase iOS

Adesso è tutto pronto per poter abilitare l’autenticazione con Firebase e linguaggio Swift!

Registrare un nuovo Utente

La registrazione di un nuovo utente tramite Email e Password, con Firebase per iOS, è qualcosa di estremamente semplice.

Il metodo da utilizzare è il createUser contenuto all’interno del framework FirebaseAuth. Questo metodo, che si presenta nella seguente forma, ha per parametri:

  • withEmail: L’email dell’utente. Noi la pescheremo dal TextField presente nel SignupViewController.
  • password: La password dell’utente da utilizzare per il login.
  • completion: La closure che contiene il risultato della creazione o meno dell’utente. Una volta implementata avrà due parametri, un FIRUser che conterrà il riferimento al nuovo utente creato su Firebase ed un NSError nel caso in cui ci fosse un problema nella registrazione. 

Entra nel file SignupViewController e, per prima cosa importa il FirebaseAuth:

Successivamente, nel tuo bottone per la registrazione (nel mio progetto è la IBAction signup_clicked), aggiungi il seguente codice per la registrazione di un utente su Firebase:

All’interno della closure completion, viene controllato lo stato della registrazione. Se il guard error == nil non viene attivato, cioè error è nil, allora la registrazione è avvenuta con successo. In questo caso, il parametro user (che è un oggetto FIRUser), viene riempito con i dati dell’utente (email e password).

Nel caso opposto, in cui la registrazione non fosse avvenuta, error sarà riempito con il problema in questione. I motivi per cui si possono verificare degli errori di registrazione possono essere diversi. I più famosi sono:

  • Utente già registrato.
  • Email non conforme (cioè manca il parametro @ e .).
  • Password debole (deve avere almeno 6 caratteri).
  • Caratteri non supportati (email scritte con caratteri speciali).

Infine, se tutto è andato per il verso giusto, viene invocato il segue verso la HomeViewController. Il segue è stato inserito all’interno della closure completion in quanto, questa, viene chiamata in asincrono rispetto all’esecuzione del codice (cioè viene chiamata in un secondo momento). Se avessi scritto il performSegue dopo il codice per l’autenticazione avresti spostato la visualizzazione in un VC diverso anche se l’autenticazione non fosse avvenuta.

Qui, un esempio del funzionamento:

Firebase iOS registrazione account

Nel caso in cui volessi comunicarlo all’utente e stai utilizzando il mio progetto, puoi utilizzare l’ErrorMessageView così:

Questo farà comparire l’AlertView sullo schermo con le informazioni sull’errore. Ho parlato nel dettaglio delle Alert View in questo tutorial.

Login Utente

Una volta capito il funzionamento, le funzioni utilizzate sono tutte identiche. Nel caso del login, cambia solamente il nome della funzione ma il comportamento è uguale a quella utilizzata per la creazione dell’account.

Al solito, comincia importando il framework FirebaseAuth nel tuo LoginViewController:

Il metodo utilizzato per il login è il signIn, che si presenta così:

Anche in questo caso, withEmail e password rappresentano i dati da utilizzare per il login. Questi dati dovranno essere già presenti su Firebase dato che stiamo provvedendo ad autenticare l’utente. Il completion contiene il risultato dell’operazione di login. É una closure che ha per parametri un FIRUser ed un NSError identici al caso analizzato del createUser.

Nel tuo bottone di login, dopo aver controllato la presenza di un testo nei due Text Field email e password, implementa il metodo per il login con Firebase:

Semplice no? Se hai avuto qualche problema, fammelo sapere scrivendo un commento in fondo al tutorial.

Current User e passaggio diretto alla Home

Una delle particolarità del framework di Firebase è che riesce a mantenere la sessione dell’utente anche quando l’applicazione viene chiusa e riaperta. Cioè, una volta che è stato eseguito il login, viene memorizzato l’utente in locale.

L’utente vien conservato all’interno della proprietà currentUser dell’oggetto FIRAuth. Questa proprietà è nil se non esiste un utente oppure contiene l’istanza dell’utente come FIRUser:

Potresti sfruttare questa proprietà per saltare la pagina di Login per spostarti direttamente alla Home. 

Queste operazioni di setting dell’app devono essere effettuate nell’AppDelegate e precisamente nel metodo didFinishLaunchingWithOptions che, come spiegato nel corso di sviluppo applicazioni iOS, viene richiamato prima della visualizzazione dello Storyboard.

All’interno del tuo AppDelegate e didFinishLaunchingWithOptions, sotto il FIRApp.configure(), aggiungi il seguente codice:

Per poter visualizzare il corretto ViewController in base al case del currentUser, devi settare lo StoryboardIdentifier ai ViewController in questione in modo da poterli istanziare da codice.

Spostati nel tuo StoryBoard, seleziona il LoginViewController e, nel pannello di Identity Inspector, attiva Use Storyboard Identifier e assegna lo stesso nome della classe come Storyboard ID:

Storyboard Identifier

La stessa identica operazione devi eseguirla anche per la HomeViewController.

Una volta attivati gli Storyboard ID, ritorna nell’AppDelegate e modifica il precedente codice con il seguente:

Adesso, se avvierai l’applicazione dopo aver effettuato il login dell’utente, vedrai che passerà direttamente alla Home senza visualizzare la LoginViewController.

Autenticazione e Database Realtime

Con la sola e semplice autenticazione ci faresti ben poco. In base alle tue esigenze ti servirà l’autenticazione per archiviare correttamente le informazioni dell’utente.

Con Firebase hai già visto, dal tutorial precedente, come poter memorizzare i dati sul suo database realtime. Ora è arrivato il momento di studiare come creare una struttura dei dati per i tuoi utenti.

Da dove si parte?

Ad ogni utente registrato, viene fornito un ID univoco chiamato User UID. 

User UUID Firebase autenticazione

Questo ID potrai utilizzarlo per la scrittura della tua struttura dei nodi del database realtime di Firebase. Cioè, potrai prevedere una struttura del seguente tipo: basePathApp/users/UserUID.

Il setting dello spazio di archiviazione dell’utente puoi farlo in diversi punti dell’applicazione. Sarebbe più naturale farlo durante la fase di registrazione che eviterebbe la ridondanza e la ripetizione di codice che risulterà superfluo durante la normale esecuzione dell’applicazione.

Dato che noi abbiamo già creato un utente, ipotizziamo che l’applicazione permetta la memorizzazione nel database realtime di Firebase in un aggiornamento futuro. In questo caso puoi fare il setting dell’applicazione su AppDelegate o al momento del login.

Ad ogni modo, qualsiasi sia la strada che percorrerai, assicurati di eseguire il setting una ed una sola volta. Altrimenti il codice verrà sempre eseguito e sovraccaricherai di richieste il database di Firebase. Magari, potresti optare per un booleano salvato nell’NSUserDefaults per prevenire l’esecuzione ridondante del codice.

Dato che stiamo scrivendo un progetto di didattico, scriverai il tuo codice nella HomeViewController.

Nel tuo viewDidLoad del tuo VC che svolge il compito di Home, scrivi:

Così facendo, non appena entrerai dentro la Home, verrà creato il relativo nodo per l’utente in questione:

Firebase login e database realtime iOS

FIRUser, proprietà ed aggiornamento dati

Scendiamo un po’ nel dettaglio della struttura dell’oggetto FIRUser.

Alcune proprietà le hai già potute assaporare in fase di registrazione e login. Oltre quelle né esistono altre che puoi modificare a tuo piacimento. La lista delle proprietà è la seguente:

  • email: L’email associata all’utente. In base alle impostazione del pannello Auth di Firebase, può esistere uno o più utenti che utilizzano la stessa email.
  • password: La pws deve essere composta ad almeno 6 caratteri. Questa è quella utilizzata con l’autenticazione classica con email.
  • displayName: Una sorta di Username dell’utente. Puoi utilizzarlo per creare una struttura degli utenti diversa da quella proposta con l’uid. Ricordati che nel Database Realtime le chiavi devono essere univoche. Di conseguenza, se utilizzi il displayName, non potranno esistere utenti con displayName uguale.
  • photoUrl: Contiene l’URL della foto profilo dell’utente. Non abbiamo studiato lo Storage dei file con Firebase, però puoi facilmente dedurre come qui andrà messo l’URL del nodo in cui è memorizzata la foto.
  • uid: Già incontrato, rappresenta un identificativo univoco per utente. Puoi star sicuro che non esisteranno utenti con uid uguale. Ecco perché l’ho utilizzato come nodo per la struttura degli utenti.

A parte la proprietà uid, tutte le altre sono opzionali di default. 

FIRUserProfileChangeRequest

Per poter aggiornare le proprietà del currentUser non basta modificare le sue proprietà. Bisogna utilizzare un oggetto specifico. Questo oggetto prende il nome di FIRUserProfileChangeRequest.

Il FIRUserProfileChangeRequest ti permette di settare i nuovi dati dell’utente e di aggiornarli in asincrono rispetto all’esecuzione dell’applicazione. Questo evita di bloccare l’app e controlla gli eventuali problemi d’aggiornamento.

Le proprietà che puoi modificare con questo oggetto sono solamente la displayName e la photoUrl. Per l’aggiornamento dell’email e password dovrai utilizzare un altro sistema che vedrai tra poco.

Una volta che recuperi l’istanza del currentUser, ti basterà recuperare l’oggetto FIRUserProfileChangeRequest dall’omonima proprietà del currentUser:

Successivamente, questo changeRequest avrà le stesse proprietà del FIRUser corrente. Ti basterà modificarle con i nuovi dati. Per esempio, proviamo ad aggiungere il displayName all’utente.

Infine, queste modifiche le dovrai inviare a Firebase utilizzando il metodo commitChanges. Come unico parametro avrà un closure con l’eventuale errore nel caso non dovesse riuscire ad aggiornare i dati:

Nel progetto che trovi a fine lezioni ho inserito una textfield ed un bottone per l’aggiornamento del displayName dell’utente. In più ho salvato questo valore anche nel Database Realtime di Firebase:

Firebase autenticazione iOS e linguaggio swift aggiornamento displayName

updateEmail

Ti faccio solamente vedere i metodi e poi lascio a te l’implementazione nella tua applicazione.

updatePassword

Obbligo di nuova autenticazione

Alcune operazioni importanti come l’aggiornamento dell’email, password o cancellazione dell’utente richiedono la ri autenticazione dell’utente per poter essere confermate. Questa ri autenticazione viene richiesta allo scoccare di un tot tempo (non ben definito) passato dall’ultima autenticazione.

A tal proposito puoi verificare la presenza di questo errore quando uno dei metodi sopra citati presenta il codice FIRAuthErrorCodeCredentialTooOld.

In questo caso puoi ritornare alla pagina di login dell’applicazione oppure puoi far comparire una schermata in sovraimpressione in cui richiedere nuovamente i dati.

Logout Utente

Anche il logout è estremamente semplice. Ti basta invocare il metodo signOut() per poter scollegare definitivamente l’account dalla sessione corrente. Ovviamente spetterà a te riportare l’applicazione sulla pagina di login.

Il metodo signOut è passibile ad eccezione, quindi dovrai gestirlo con un do-try-catch.

Nel tuo bottone di logOut (nel mio progetto è il bottone con IBAction) aggiungi il seguente codice:

Se vuoi anche spostare la visualizzazione alla pagina di login puoi utilizzare lo stesso sistema usato nell’AppDelegate. Ovvero puoi instanziare il vc LoginViewController subito dopo il try signOut().

Firebase e Login Facebook

Dato che il progetto è compatibile con iOS 10 ed Xcode 8, ci sono alcuni problemi con i framework di Facebook per l’autenticazione.

Non appena aggiorneranno il framework di Facebook, aggiornerò questa parte del tutorial.

Conclusione e Download

Secondo le regole Apple, non puoi utilizzare l’autenticazione con email e password senza aver inserito la privacy policy dei dati. Puoi creare una privacy policy della tua applicazione utilizzando iubenda.com. Una volta creata ti basterà mettere il link nella pagina di login o registrazione (in alternativa puoi usare un ViewController in cui aprire la WKWebView con la privacy policy).

Nel prossimo tutorial ti farò vedere come creare una piccola chat globale tra gli utenti della tua applicazione. Per il momento esercitati a mettere in relazione i dati creati da ogni utente con il Database Realtime.

Qui di seguito trovi il progetto completo.

[sociallocker]DropBox Download[/sociallocker]

Una volta scaricato dovrai:

  1. Installare i pod con il comando “pod install”.
  2. Aggiungere solamente il tuo file GoogleService-info.plist.

Se hai avuto qualche problema con il tutorial, fammelo sapere lasciando un commento.

Buona Programmazione!

Start typing and press Enter to search

Il database Realtime di Firebase con il linguaggio Swiftcome-creare-sticker-pack-per-imessage-ios-con-xcode