Serverless Apps med Firebase Cloud Funksjoner

Firebase har som mål å hjelpe utviklere til å bygge bedre apper og utvide dem til vellykkede bedrifter. Ved å ta vare på din app-back-end eller infrastruktur, kan Firebase du fokusere på å løse problemer for brukerne. En av de nye spennende funksjonene som ble annonsert på Google Cloud Next '17-konferansen i mars for Firebase, var Cloud Functions. I denne opplæringen lærer du om denne nye funksjonen ved å bygge en enkel Android-app med den. 

Hva er Cloud Funksjoner for Firebase?

Firebase Cloud Funksjoner kjører i et vertsbasert, privat og skalerbart Node.js-miljø der du kan kjøre JavaScript-kode. Du oppretter bare reaktive funksjoner som utløser når en hendelse oppstår. Cloud-funksjoner er tilgjengelige for både Google Cloud Platform og Firebase (de ble bygget på toppen av Google Cloud-funksjoner). 

For øyeblikket støtter Cloud Functions følgende triggere som du kan lytte til og svare på:

  • Realtime Database Triggers: brann en funksjon når en skrivehendelse skjer på en sti i en database.
  • Autentiseringsutløsere: Brann en funksjon når en ny bruker er opprettet eller når en bruker slettes.
  • Analytics-utløsere: Brann en funksjon når en ny konverteringshendelse logges.
  • Cloud Storage Utløser: En funksjon kan avfyres når det er noen endring i en bøtte, for eksempel en fil eller mappe, opplasting, oppdatering eller sletting.
  • Cloud Pub / Sub Triggers: Brann en funksjon når en ny melding mottas i et Google Cloud Pub / Sub-emne.
  • HTTPS Utløser: Brann når en forespørsel blir gjort til et sluttpunkt.

Så hvorfor bruke Cloud-funksjoner?

Så nå har du sett rekkevidde av muligheter som Cloud Functions kan tilby. Men hvorfor bruke dem? 

Å kjøre og sette opp en bakre ende og servere kan være en ekte smerte. Du må håndtere problemer som skalerbarhet og skrivingskode på server-side språk, men med Cloud Functions reduseres denne kompleksiteten. Beregningsintensiv oppgaver kan også utføres i skyen i stedet for på klientenheten (for eksempel størrelsen på bildet for opplasting eller skriving til flere baner i databasen). Koden din vil også være sikrere i skyen enn på klientenheten, slik at du trygt kan lagre data som hemmelige taster på serveren din. 

I denne opplæringen lærer du hvordan du bruker Realtime Database Triggers som vil brenne når en database skrivehendelse oppstår. Deretter ser vi hvordan du bruker tjenesten Firebase Cloud Messaging til å sende et varsel til enheter som abonnerer på et emne. Vi lager en enkel app som heter Tutsplus Alerts, som vil sende et varsel til abonnenter av "android" emnet når en ny artikkel er tilgjengelig.

Forutsetninger 

For å følge med denne opplæringen, bør du være kjent med:

  • Firebase Realtime Database
  • Firebase Cloud Messaging
  • Sette opp et Firebase-prosjekt

Og du bør ha Node.js installert på datamaskinen din.

Ta en titt på følgende veiledninger her på Envato Tuts + hvis du trenger hjelp med å komme i gang med Firebase:

1. Lag en Firebase Cloud-funksjon

Installer Firebase CLI 

Nå som forutsetningene er satt opp, la oss laste ned Cloud Functions.

For å begynne å bruke Cloud Functions, trenger vi Firebase CLI (kommandolinjegrensesnitt) installert fra npm. Hvis du allerede har Node satt opp på maskinen din, kan du installere Cloud Functions med:

npm installer -g firebase-verktøy

Denne kommandoen vil installere Firebase CLI globalt sammen med eventuelle nødvendige Node.js-avhengigheter.

Initialiser prosjektet

For å initialisere prosjektet ditt:

  1. Løpe Firebase login å logge på Firebase via nettleseren og autentisere CLI-verktøyet.
  2. Opprett en ny prosjektkatalog med navnet tutsplus-varsler.
  3. Endelig løp firebase init funksjoner fra den nye katalogen. Dette verktøyet gir deg muligheten til å installere avhengigheter med NPM. Det er trygt å avvise hvis du vil håndtere avhengigheter på en annen måte.

Etter at disse kommandoene er fullført, ser prosjektstrukturen ut slik:

  • .firebaserc: En skjult fil som hjelper deg raskt å bytte mellom prosjekter med brannbruk bruk.
  • firebase.json: beskriver egenskaper for prosjektet ditt.
  • funksjoner /: Denne mappen inneholder all kode for funksjonene dine.
  • Funksjonene / package.json: en NPM-pakkefil som beskriver Cloud-funksjonene.
  • funksjoner / index.js: Hovedkilden for Cloud Functions-koden.
  • Funksjonene / node_modules /: mappen der alle NPM-avhengighetene dine er installert.

Importer de nødvendige modulene og initier applikasjonen 

For å utvikle vår enkle Tutsplus Alerts-app trenger vi bare to node-moduler: Cloud Functions og Admin SDK-moduler (disse modulene er allerede installert for oss). Så gå til index.js og krever disse modulene, og deretter initialisere en admin app instans.

var functions = krever ('firebase-funksjoner'); var admin = krever ('firebase-admin'); admin.initializeApp (. functions.config () Fire);

Kode Cloud-funksjonen

Nå som de nødvendige modulene for prosjektet vårt er importert og initialisert, la oss kode vår skyfunksjon i index.js fil. Som tidligere sagt, skal vi skrive en funksjon som vil bli sparket når en onWrite () hendelsen oppstår i vår Firebase realtime database og deretter, som svar, vil sende et varsel (en nedstrøms melding) til abonnenter på enheten.

// ... exports.sendNotification = functions.database.ref ('/ articles / articleId') .onWrite (event => // Grab gjeldende verdi av det som ble skrevet til Realtime Database. Var eventSnapshot = event.data ; var str1 = "Forfatter er"; var str = str1.concat (eventSnapshot.child ("author") .val ()); console.log (str); var topic = "android"; var nyttelast = data: title: eventSnapshot.child ("title") .val (), forfatter: eventSnapshot.child ("author") .val (); // Send en melding til enheter som abonnerer på oppgitt emne. () .sendToTopic (emne, nyttelast) .then (funksjon (svar) // Se referansedokumentasjonen for MessagingTopicResponse for // innholdet i svaret. console.log ("Sendt sendt melding:", svar);). (funksjon (feil) console.log ("Feil sending melding:", feil);););

I koden ovenfor lytter vi til databasebanen / artikler / artikkelID, hvor ArtikkelID representerer iden til artikkelen som ble skrevet vellykket. Nå er det vi er veldig opptatt av, dataene som ble skrevet. For å få det, bruker vi event.data, som er et DeltaSnapshot statisk grensesnitt. 

Deretter legger du til data fra dette øyeblikksbildet til en nyttelast for meldinger og sender den til "android" -emnet. Den asynkrone koden forenkles med JavaScript-løfter. 

Merk at i koden ovenfor skrev vi til konsollen ved å bruke console.log (), som vil hjelpe oss med feilsøking og overvåking. Vi kan se denne loggen enten i Firebase-dashbordet eller via kommandolinjen med: 

ildbasefunksjoner: logg

Vær oppmerksom på at siden dette kjører på Node.js, kan du installere andre moduler tilgjengelig fra NPM. Du kan også kode i JavaScript ES6 eller TypeScript i stedet for vanilla JavaScript. 

Distribuere Cloud-funksjonen

La oss distribuere vår Cloud-funksjon. Kjør denne kommandoen for distribusjon:

$ firebase distribuere - bare funksjoner

Nå kan vi kode Android-appen som vil abonnere på emnet, skrive til realtidsdatabasen, og motta et varsel når data er skrevet til vår realtidsdatabase - det er da vår skyfunksjon ville bli utført! 

2. Opprett TutsplusAlerts App

Lag et Android Studio-prosjekt

Først, brann opp Android Studio og opprett et nytt prosjekt "TutsplusAlerts"med en tom aktivitet kalt Hoved aktivitet.

For å følge med, sørg for at du har integrert Firebase i appen din. 

Legg til Realtime Database Dependency

Legg til følgende avhengighet til din build.gradle fil:

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

Pass på at du synkroniserer prosjektet ditt etter å ha lagt det til.

Lag modellen

La oss modellere en artikkel enhet for å være vedvarende til vår realtime database.

offentlig klasse Artikkel Public String title; offentlig String forfatter; offentlig artikkel () // Standardkonstruksjon kreves for samtaler til DataSnapshot.getValue (Article.class) offentlig artikkel (Stringtittel, Stringforfatter) this.title = title; this.author = author; 

Opprett XML-oppsettet 

Vår XML-layout for hovedaktiviteten vil bare ha to EditTexts og bare en knapp som vil sende inn den nye artikkelen.

    

Skriv til Realtime Database

Nå skal vi skrive til Realtime Database-banen / artikler /.

// ... @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); siste FirebaseDatabase database = FirebaseDatabase.getInstance (); Endelig EditText titleEditText = (EditText) findViewById (R.id.et_title); Endelig EditText authorEditText = (EditText) findViewById (R.id.et_author); Button submitButton = (Button) findViewById (R.id.btn_submit); submitButton.setOnClickListener (ny View.OnClickListener () @Override public void onClick (Vis visning) DatabaseReference myRef = database.getReference ("articles"). push (); Artikkelartikkel = nytt Artikkel (titleEditText.getText () .String (), authorEditText.getText (). toString ()); myRef.setValue (artikkel););  // ... 

Appen din trenger skriveadgang til databasen. Bare for demo-formål kan du angi sikkerhetsregler for å tillate at alle leser og skriver. I en ekte applikasjon vil du aldri bruke slike usikre sikkerhetsinnstillinger.

"regler": ".read": "true", ".write": "true"

Du kan lære mer om Firebase Security Rules i mitt innlegg her på Envato Tuts+.

Kjør programmet

På dette stadiet kan vi teste appen og se om Cloud Funksjonen ble utført med hell. Skriv inn en tittel og forfatter, og klikk deretter på send-knappen. Etter det, besøk funksjoner dashbord og se loggene. Vår tilpassede logg skal vises.

Fra loggene over ser vi at vi har fullført vår Cloud-funksjon og sendt en melding med nyttelast til enheter som abonnerer på "android'emne, men ingen enhet har abonnert på emnet ennå. I neste avsnitt bruker vi Firebase Cloud Messaging, slik at enheter kan abonnere på et emne og deretter behandle den innkommende meldingen fra serveren for å vise et varsel. 

3. Legg til Firebase Cloud Messaging Support

Inkluder avhengigheten 

Inkluder Firebase Messaging avhengighet til din build.gradle fil og synkroniser prosjektet ditt etterpå:

kompilere 'com.google.firebase: firebase-messaging: 10.2.1'

håndtering Meldinger

Vi må opprette en tjeneste som utvider FirebaseMessagingService og overstyrer onMessageReceived callbacks. 

pakke com.chikeandroid.tutsplusalerts; importer com.google.firebase.messaging.FirebaseMessagingService; importer com.google.firebase.messaging.RemoteMessage; importer android.app.NotificationManager; importer android.app.PendingIntent; importer android.content.Context; importer android.content.Intent; importer android.media.RingtoneManager; importer android.net.Uri; importer android.support.v4.app.NotificationCompat; offentlig klasse MyFirebaseMessagingService utvider FirebaseMessagingService @Override public void onMessageReceived (RemoteMessage remoteMessage) // Sjekk om meldingen inneholder en data nyttelast. hvis (remoteMessage.getData () .størrelse ()> 0) showNotification (remoteMessage.getData (). get ("title"), remoteMessage.getData (). get ("author"));  // Sjekk om meldingen inneholder en nyttelast for varsling. hvis (remoteMessage.getNotification ()! = null)  privat void showNotification (String title, String author) Intent intention = new Intent (dette, MainActivity.class); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity (dette, 0 / * Forespørselskode * /, hensikt, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = ny NotificationCompat.Builder (this) .setContentTitle ("Ny artikkel:" + tittel) .setSmallIcon (R.mipmap.ic_launcher) .setContentText ("By" + forfatter) .setAutoCancel (true) .setSound (defaultSoundUri ) .setContentIntent (pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService (Context.NOTIFICATION_SERVICE); notificationManager.notify (0 / * ID of notification * /, notificationBuilder.build ()); 

I den ovennevnte koden får vi også nyttelastene for data og viser det i et varsel, uavhengig av om programmet ligger i forgrunns- eller bakgrunnsstatus.  

Oppdater den manifeste filen

Oppdater manifestfilen, inkludert tjenesten som ble opprettet tidligere inne i stikkord.

// ...      // ... 

Abonner på et emne

Til slutt må vi abonnere på emnet 'android'slik at enheten kan motta og behandle meldinger sendt til det aktuelle emnet. 

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

Kjør programmet 

Kjør appen for andre gang og skriv inn en tittel og en forfatter, og klikk deretter på send-knappen. Denne gangen vises et varsel når en ny artikkel blir lagt ut i databasen av en hvilken som helst appbruker.

For å gjøre dette før Cloud Functions, ville du ha behov for en HTTP- eller XMPP-server, noe som vil bety at flere kodeer skal skrives, samt en server for å sette opp og støtte.

Konklusjon

I denne opplæringen har du lært om Cloud Functions for Firebase: hva de er, hvorfor du kanskje trenger dem, og hvordan du begynner å bruke Cloud Functions for appen din. Vær oppmerksom på at Cloud Functions for Firebase fortsatt er i offentlig beta som av denne skrivingen. 

Hvis du vil vite mer om Cloud Functions for Firebase, kan du se den offisielle dokumentasjonen. Og i mellomtiden, sjekk ut noen av våre andre kurs og opplæringsprogrammer på Android app utvikling!