App serverless con funzioni Cloud di Firebase

L'obiettivo di Firebase è aiutare gli sviluppatori a creare app migliori e farle crescere in aziende di successo. Prendendo cura del back-end o dell'infrastruttura dell'app, Firebase ti consente di concentrarti sulla risoluzione dei problemi per i tuoi utenti. Una delle nuove interessanti funzionalità annunciate alla conferenza Google Cloud Next 17 in corso questa settimana per Firebase è stata Cloud Functions. In questo tutorial, scoprirai questa nuova funzionalità costruendo con essa una semplice app per Android. 

Quali sono le funzioni cloud per Firebase?

Le funzioni cloud di Firebase vengono eseguite in un ambiente Node.js ospitato, privato e scalabile in cui è possibile eseguire il codice JavaScript. È sufficiente creare funzioni reattive che si attivano ogni volta che si verifica un evento. Le funzioni cloud sono disponibili sia per Google Cloud Platform che per Firebase (sono state create su Google Cloud Functions). 

Per ora, le funzioni cloud supportano i seguenti trigger che puoi ascoltare e rispondere a:

  • Trigger del database in tempo reale: attiva una funzione quando si verifica un evento di scrittura su un percorso in un database.
  • Trigger di autenticazione: attiva una funzione quando viene creato un nuovo utente o quando viene cancellato un utente.
  • Trigger di Analytics: attiva una funzione quando viene registrato un nuovo evento di conversione.
  • Trigger di archiviazione cloud: è possibile attivare una funzione quando si verificano modifiche in un bucket, ad esempio caricamento di file o cartelle, aggiornamento o eliminazione.
  • Cloud Pub / Triggers secondari: attiva una funzione quando viene ricevuto un nuovo messaggio in un argomento Google Cloud Pub / Sub.
  • Trigger HTTPS: attivazione quando viene effettuata una richiesta a un endpoint.

Quindi perché usare le funzioni cloud?

Così ora hai visto la gamma di funzionalità che Cloud Functions può offrire. Ma perché usarli? 

L'esecuzione e la configurazione di un back-end e di server può essere un vero problema: devi gestire problemi come la scalabilità e la scrittura di codice nei linguaggi lato server, ma con le funzioni cloud, questa complessità è ridotta. Inoltre, è possibile eseguire attività computazionalmente intensive nel cloud anziché sul dispositivo client (come il ridimensionamento delle immagini per il caricamento o la scrittura su più percorsi del database). Il codice sarà anche più sicuro nel cloud rispetto al dispositivo client, quindi puoi archiviare in modo sicuro dati come le chiavi segrete sul tuo server. 

In questo tutorial, imparerai come utilizzare i trigger di database in tempo reale che si attivano quando si verifica un evento di scrittura del database. Quindi, vedremo come utilizzare il servizio Firebase Cloud Messaging per inviare una notifica ai dispositivi che hanno sottoscritto un argomento. Creeremo una semplice app chiamata Avvisi di Tutsplus, che invierà una notifica agli abbonati dell'argomento "Android" ogni volta che sarà disponibile un nuovo articolo.

Prerequisiti 

Per seguire questo tutorial, dovresti avere familiarità con:

  • Database in tempo reale di Firebase
  • Firebase Cloud Messaging
  • Impostazione di un progetto Firebase

E dovresti avere Node.js installato sul tuo computer.

Consulta le seguenti esercitazioni qui su Envato Tuts + se hai bisogno di aiuto per iniziare con Firebase:

1. Creare una funzione Cloud Firebase

Installa la CLI di Firebase 

Ora che sono stati impostati i prerequisiti, scarichiamo le funzioni cloud.

Per iniziare a utilizzare le funzioni cloud, abbiamo bisogno della Firebase CLI (interfaccia a riga di comando) installata da npm. Se hai già impostato il nodo sul tuo computer, puoi installare le funzioni cloud con:

npm install -g firebase-tools

Questo comando installerà la CLI di Firebase globalmente insieme a tutte le dipendenze necessarie di Node.js.

Inizializza il progetto

Per inizializzare il tuo progetto:

  1. Correre login firebase accedere a Firebase tramite il browser e autenticare lo strumento CLI.
  2. Crea una nuova directory di progetto con il nome tutsplus-avvisi.
  3. Finalmente, corri firebase init functions da quella nuova directory. Questo strumento ti offre la possibilità di installare le dipendenze con NPM. È sicuro rifiutare se si desidera gestire le dipendenze in un altro modo.

Dopo che questi comandi sono stati completati correttamente, la struttura del tuo progetto si presenta così:

  • .firebaserc: un file nascosto che ti aiuta a passare rapidamente da un progetto all'altro l'uso di Firebase.
  • firebase.json: descrive le proprietà per il tuo progetto.
  • funzioni /: questa cartella contiene tutto il codice per le tue funzioni.
  • Funzioni / package.json: un file del pacchetto NPM che descrive le tue funzioni cloud.
  • funzioni / index.js: la fonte principale per il codice delle funzioni Cloud.
  • Funzioni / node_modules /: la cartella in cui sono installate tutte le dipendenze NPM.

Importa i moduli necessari e inizializza l'app 

Per sviluppare la nostra semplice app Tutsplus Alerts, abbiamo solo bisogno di due moduli nodo: i moduli Cloud Functions e Admin SDK (questi moduli sono già installati per noi). Quindi vai al index.js e richiedono questi moduli, quindi inizializzare un'istanza dell'app di amministrazione.

var functions = require ('firebase-functions'); var admin = require ('firebase-admin'); admin.initializeApp (. functions.config () Firebase);

Codifica la funzione cloud

Ora che i moduli richiesti per il nostro progetto sono stati importati e inizializzati, codifichiamo la nostra funzione cloud in index.js file. Come affermato in precedenza, scriveremo una funzione che verrà attivata quando un OnWrite () evento si verifica nel nostro database in tempo reale di Firebase e quindi, in risposta, invierà una notifica (un messaggio a valle) agli abbonati al dispositivo.

// ... exports.sendNotification = functions.database.ref ('/ articles / articleId'). OnWrite (event => // Prendi il valore corrente di ciò che è stato scritto nel Realtime Database. Var eventSnapshot = event.data ; var str1 = "Autore è"; var str = str1.concat (eventSnapshot.child ("autore"). val ()); console.log (str); var topic = "android"; var payload = dati: title: eventSnapshot.child ("title"). val (), autore: eventSnapshot.child ("author"). val (); // Invia un messaggio ai dispositivi sottoscritti all'argomento fornito. return admin.messaging () .sendToTopic (topic, payload) .then (function (response) // Vedi la documentazione di riferimento di MessagingTopicResponse per // contenuto della risposta console.log ("Messaggio inviato con successo:", response);) .catch (function (error) console.log ("Error sending message:", error);););

Nel codice sopra, stiamo ascoltando il percorso del database / articoli / articleID, dove ArticleId rappresenta l'id dell'articolo che è stato scritto con successo. Ora, quello di cui siamo veramente preoccupati sono i dati che sono stati scritti. Per ottenere ciò, usiamo event.data, che è un'interfaccia statica DeltaSnapshot. 

Successivamente, aggiungi i dati da questa istantanea al payload di un messaggio e invialo all'argomento "android". Il codice asincrono è semplificato con le promesse di JavaScript. 

Si noti che nel codice sopra, abbiamo scritto alla console usando console.log (), che ci aiuterà nel debugging e nel monitoraggio. Possiamo visualizzare questo registro nella nostra dashboard Firebase o tramite la riga di comando con: 

funzioni di Firebase: log

Tieni presente che dal momento che viene eseguito su Node.js, puoi installare altri moduli disponibili da NPM. È inoltre possibile codificare JavaScript ES6 o TypeScript invece di JavaScript vaniglia. 

Distribuire la funzione cloud

Implementiamo la nostra funzione cloud. Esegui questo comando per la distribuzione:

$ firebase deploy --only functions

Ora possiamo codificare l'app per Android che si iscriverà all'argomento, scrivere sul database in tempo reale e ricevere una notifica quando i dati vengono scritti nel nostro database in tempo reale, ovvero quando verrà eseguita la nostra funzione cloud! 

2. Creare l'app TutsplusAlerts

Crea un progetto per Android Studio

Innanzitutto, avvia Android Studio e crea un nuovo progetto "TutsplusAlerts"con un'attività vuota chiamata Attività principale.

Per continuare, assicurati di aver integrato Firebase nella tua app. 

Aggiungi la dipendenza del database in tempo reale

Aggiungi la seguente dipendenza al tuo build.gradle file:

compila 'com.google.firebase: firebase-database: 10.2.1' 

Assicurati di sincronizzare il tuo progetto dopo averlo aggiunto.

Crea il modello

Modelliamo un'entità articolo da mantenere nel nostro database in tempo reale.

Articolo di classe pubblica titolo di stringa pubblica; autore di stringhe pubbliche; public Article () // Costruttore predefinito richiesto per le chiamate a DataSnapshot.getValue (Article.class) public Article (String title, String author) this.title = title; this.author = autore; 

Crea il layout XML 

Il nostro layout XML per l'attività principale avrà solo due EditTexts e solo un pulsante che presenterà il nuovo articolo.

    

Scrivi nel database Realtime

Ora stiamo andando a scrivere sul percorso Realtime Database / articoli /.

// ... @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); database FirebaseDatabase finale = FirebaseDatabase.getInstance (); final EditText titleEditText = (EditText) findViewById (R.id.et_title); final EditText authorEditText = (EditText) findViewById (R.id.et_author); Button submitButton = (Button) findViewById (R.id.btn_submit); submitButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (Visualizza vista) DatabaseReference myRef = database.getReference ("articles"). push (); Articolo article = new Article (titleEditText.getText (). toString (), authorEditText.getText (). toString ()); myRef.setValue (article););  // ... 

La tua app avrà bisogno dell'accesso in scrittura al database. Solo per scopi dimostrativi, è possibile impostare le regole di sicurezza per consentire tutte le letture e le scritture. In un'applicazione reale, non vorrai mai utilizzare impostazioni di sicurezza insicure.

"rules": ".read": "true", ".write": "true"

Puoi trovare ulteriori informazioni sulle regole di sicurezza di Firebase nel mio post qui su Envato Tuts+.

Esegui l'app

In questa fase, possiamo testare l'app e verificare se la nostra funzione cloud è stata eseguita correttamente. Inserisci un titolo e un autore, quindi fai clic sul pulsante di invio. Successivamente, visita il funzioni dashboard e visualizza i log. Dovrebbe apparire il nostro registro personalizzato.

Dai registri precedenti, vediamo che abbiamo eseguito con successo la nostra funzione Cloud e inviato un messaggio con un payload ai dispositivi abbonati al 'androide'argomento, ma nessun dispositivo è ancora iscritto all'argomento. Nella prossima sezione, utilizzeremo Firebase Cloud Messaging in modo che i dispositivi possano iscriversi a un argomento e quindi elaborare il messaggio in arrivo dal server per mostrare una notifica. 

3. Aggiungi il supporto di Firebase Cloud Messaging

Includi la dipendenza 

Includere la dipendenza da Firebase Messaging al tuo build.gradle file e sincronizza il tuo progetto in seguito:

compila "com.google.firebase: firebase-messaging: 10.2.1"

la gestione dei messaggi

Dobbiamo creare un servizio che estenda FirebaseMessagingService e sovrascriva il onMessageReceived callback. 

pacchetto com.chikeandroid.tutsplusalerts; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; importare android.app.NotificationManager; importare android.app.PendingIntent; importare android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.support.v4.app.NotificationCompat; public class MyFirebaseMessagingService estende FirebaseMessagingService @Override public void onMessageReceived (RemoteMessage remoteMessage) // Controlla se il messaggio contiene un payload di dati. if (remoteMessage.getData (). size ()> 0) showNotification (remoteMessage.getData (). get ("title"), remoteMessage.getData (). get ("author"));  // Controlla se il messaggio contiene un carico utile di notifica. if (remoteMessage.getNotification ()! = null)  private void showNotification (String title, String author) Intent intent = new Intent (this, MainActivity.class); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity (this, 0 / * Codice richiesta * /, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder (this) .setContentTitle ("Nuovo articolo:" + title) .setSmallIcon (R.mipmap.ic_launcher) .setContentText ("By" + author) .setAutoCancel (true) .setSound (defaultSoundUri ) .setContentIntent (pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService (Context.NOTIFICATION_SERVICE); notificationManager.notify (0 / * ID della notifica * /, notificationBuilder.build ()); 

Nel codice precedente, stiamo anche ricevendo il carico utile dei dati e mostrandolo in una notifica indipendentemente dal fatto che l'applicazione sia in uno stato di primo piano o di sfondo.  

Aggiorna il file manifest

Aggiorna il file manifest, incluso il servizio creato in precedenza all'interno del file etichetta.

// ...      // ... 

Iscriviti a un argomento

Infine, dobbiamo iscriversi all'argomento 'androide'in modo che il dispositivo possa ricevere ed elaborare i messaggi inviati a quell'argomento. 

/ ... @Override protected void onCreate (Bundle savedInstanceState) // ... FirebaseMessaging.getInstance (). SubscribeToTopic ("android"); // ... // ... 

Esegui l'app 

Esegui l'app per la seconda volta e inserisci un titolo e un autore, quindi fai clic sul pulsante di invio. Questa volta, verrà visualizzata una notifica ogni volta che un nuovo articolo viene pubblicato nel database da qualsiasi utente dell'app.

Per fare ciò prima delle funzioni cloud, avresti avuto bisogno di un server HTTP o XMPP, il che significherebbe più codice da scrivere, così come un server da configurare e supportare.

Conclusione

In questo tutorial, hai appreso le funzioni di Cloud per Firebase: cosa sono, perché potresti averne bisogno e come iniziare a utilizzare le funzioni cloud per la tua app. Tieni presente che Cloud Functions for Firebase è ancora in versione beta pubblica al momento della stesura di questo documento. 

Per ulteriori informazioni su Cloud Functions for Firebase, fare riferimento alla documentazione ufficiale. E nel frattempo, dai uno sguardo ad alcuni dei nostri altri corsi e tutorial sullo sviluppo di app per Android!