Serverloze apps met Firebase Cloud-functies

Het doel van Firebase is om ontwikkelaars te helpen bij het bouwen van betere apps en deze uit te bouwen tot succesvolle bedrijven. Door zorg te dragen voor de back-end of infrastructuur van uw app, laat Firebase u zich richten op het oplossen van problemen voor uw gebruikers. Een van de nieuwe opwindende functies die tijdens de Google Cloud Next '17 -conferentie van maart voor Firebase werd aangekondigd, was Cloud Functions. In deze zelfstudie leert u meer over deze nieuwe functie door er een eenvoudige Android-app mee te bouwen. 

Wat zijn cloudfuncties voor Firebase?

Firebase Cloud Functies worden uitgevoerd in een gehoste, privé en schaalbare Node.js-omgeving waar u JavaScript-code kunt uitvoeren. U maakt eenvoudig reactieve functies die worden geactiveerd wanneer een gebeurtenis plaatsvindt. Cloudfuncties zijn beschikbaar voor zowel Google Cloud Platform als Firebase (ze zijn gebouwd bovenop Google Cloud Functies). 

Cloud Functions ondersteunt nu de volgende triggers die u kunt beluisteren en waarop u kunt reageren:

  • Realtime database-triggers: een functie activeren wanneer een schrijfgebeurtenis plaatsvindt op een pad in een database.
  • Verificatie Triggers: een functie activeren wanneer een nieuwe gebruiker wordt gemaakt of wanneer een gebruiker wordt verwijderd.
  • Analytics-triggers: een functie activeren wanneer een nieuwe conversiegebeurtenis wordt vastgelegd.
  • Cloud Storage Triggers: een functie kan worden geactiveerd wanneer er een wijziging in een bucket optreedt, zoals het uploaden, bijwerken of verwijderen van een bestand of map.
  • Cloud Pub / Sub-triggers: een functie activeren wanneer een nieuw bericht wordt ontvangen in een Google Cloud Pub / Sub-onderwerp.
  • HTTPS-triggers: activeren wanneer een verzoek wordt ingediend bij een eindpunt.

Dus waarom Cloud-functies gebruiken?

U hebt nu dus het scala aan mogelijkheden gezien dat Cloud Functions u kan bieden. Maar waarom zou u ze gebruiken?? 

Het runnen en opzetten van een back-end en servers kan heel lastig zijn - je moet omgaan met zaken als schaalbaarheid en het schrijven van code in server-side talen, maar met Cloud Functions wordt deze complexiteit verminderd. Ook kunnen computationeel intensieve taken worden uitgevoerd in de cloud in plaats van op het clientapparaat (zoals het wijzigen van de grootte van afbeeldingen voor het uploaden of schrijven naar meerdere paden van uw database). Uw code is ook veiliger in de cloud dan op het clientapparaat, zodat u veilig gegevens zoals geheime sleutels op uw server kunt opslaan. 

In deze zelfstudie leert u hoe u de realtime database-triggers gebruikt die worden geactiveerd wanneer zich een gebeurtenis voor het schrijven van een database voordoet. Vervolgens zullen we zien hoe we de Firebase Cloud Messaging-service kunnen gebruiken om een ​​melding te verzenden naar apparaten die zich hebben geabonneerd op een onderwerp. We maken een eenvoudige app genaamd Tutsplus-waarschuwingen, die een bericht stuurt naar abonnees van het "Android" -onderwerp wanneer een nieuw artikel beschikbaar is.

voorwaarden 

Volg deze tutorial om vertrouwd te zijn met:

  • Firebase Realtime Database
  • Firebase Cloud Messaging
  • Een Firebase-project opzetten

En u zou Node.js op uw computer moeten hebben geïnstalleerd.

Bekijk de volgende tutorials hier op Envato Tuts + als je hulp nodig hebt om aan de slag te gaan met Firebase:

1. Maak een Firebase Cloud-functie

Installeer de Firebase CLI 

Nu de vereisten zijn ingesteld, kunnen we Cloud Functions downloaden.

Om cloudfuncties te kunnen gebruiken, hebben we de Firebase CLI (opdrachtregelinterface) nodig die is geïnstalleerd vanaf npm. Als u al Knooppunt hebt ingesteld op uw machine, kunt u Cloud Functies installeren met:

npm install -g firebase-tools

Met deze opdracht wordt de Firebase CLI wereldwijd geïnstalleerd, samen met eventuele noodzakelijke Node.js-afhankelijkheden.

Initialiseer het project

Om uw project te initialiseren:

  1. Rennen firebase login om via de browser in te loggen op Firebase en de CLI-tool te verifiëren.
  2. Maak een nieuwe projectdirectory met de naam tutsplus-waarschuwingen.
  3. Eindelijk rennen firebase init-functies van die nieuwe map. Deze tool biedt u een optie om afhankelijkheden met NPM te installeren. Het is veilig om te weigeren als u de afhankelijkheden op een andere manier wilt beheren.

Nadat deze opdrachten met succes zijn voltooid, ziet uw projectstructuur er als volgt uit:

  • .firebaserc: een verborgen bestand waarmee u snel tussen projecten kunt schakelen firebase gebruik.
  • firebase.json: beschrijft eigenschappen voor uw project.
  • functies /: deze map bevat alle code voor uw functies.
  • functies / package.json: een NPM-pakketbestand dat uw cloudfuncties beschrijft.
  • functies / index.js: de hoofdbron voor uw Cloud Functions-code.
  • functies / node_modules /: de map waarin al uw NPM-afhankelijkheden zijn geïnstalleerd.

Importeer de benodigde modules en initialiseer de app 

Om onze eenvoudige Tutsplus Alerts-app te ontwikkelen, hebben we slechts twee knoopmodules nodig: Cloud Functions en Admin SDK-modules (deze modules zijn al voor ons geïnstalleerd). Dus ga naar de index.js en deze modules vereisen en vervolgens een instantie van een beheerde app initialiseren.

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

Codeer de cloudfunctie

Nu de vereiste modules voor ons project zijn geïmporteerd en geïnitialiseerd, kunnen we onze cloudfunctie in de code coderen index.js het dossier. Zoals eerder gezegd, gaan we een functie schrijven die wordt afgevuurd wanneer een onWrite () gebeurtenis treedt op in onze Firebase realtime database en stuurt vervolgens een melding (een stroomafwaarts bericht) naar apparaatabonnees.

// ... exports.sendNotification = functions.database.ref ('/ articles / articleId') .onWrite (event => // Grijp de huidige waarde van wat naar de Realtime-database is geschreven. Var eventSnapshot = event.data ; var str1 = "Auteur is"; var str = str1.concat (eventSnapshot.child ("auteur"). val ()); console.log (str); var topic = "android"; var payload = data: title: eventSnapshot.child ("title"). val (), author: eventSnapshot.child ("author"). val (); // Stuur een bericht naar apparaten die geabonneerd zijn op het gegeven onderwerp. return admin.messaging () .sendToTopic (topic, payload) .then (function (response) // Zie de MessagingTopicResponse-naslagdocumentatie voor de // contents of response console.log ("Successfully send message:", response);) .catch (functie (fout) console.log ("Fout bij verzenden van bericht:", fout);););

In de bovenstaande code luisteren we naar het databasepad / Artikelen / articleID, waar ArticleID staat voor de id van het artikel dat met succes is geschreven. Wat ons nu echt bezighoudt, zijn de gegevens die zijn geschreven. Om dat te krijgen, gebruiken we event.data, dat is een DeltaSnapshot statische interface. 

Voeg daarna gegevens van deze snapshot toe aan de payload van een bericht en stuur deze naar het onderwerp "Android". De asynchrone code is vereenvoudigd met JavaScript-beloften. 

Merk op dat we in de bovenstaande code schreven naar de console door te gebruiken console.log (), wat ons zal helpen bij debugging en monitoring. We kunnen dit logboek bekijken in ons Firebase-dashboard of via de opdrachtregel met: 

firebase-functies: log

Houd er rekening mee dat aangezien dit op Node.js wordt uitgevoerd, u andere modules kunt installeren die beschikbaar zijn via NPM. U kunt ook coderen in JavaScript ES6 of TypeScript in plaats van JavaScript vanille. 

Implementeer de cloudfunctie

Laten we onze cloudfunctie inzetten. Voer deze opdracht uit voor implementatie:

$ firebase deploy - alleen functies

Nu kunnen we de Android-app coderen die zich op het onderwerp abonneert, naar de realtime-database schrijft en een melding ontvangt wanneer gegevens naar onze realtime database worden geschreven, dat wil zeggen dat onze cloud-functie wordt uitgevoerd! 

2. Maak de TutsplusAlerts-app

Maak een Android Studio-project

Allereerst, start Android Studio op en maak een nieuw project "TutsplusAlerts"met een lege activiteit genaamd Hoofdactiviteit.

Volg de stappen om ervoor te zorgen dat je Firebase hebt geïntegreerd in je app. 

Voeg de realtime database-afhankelijkheid toe

Voeg de volgende afhankelijkheid toe aan uw build.gradle het dossier:

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

Zorg ervoor dat je je project synchroniseert nadat je het hebt toegevoegd.

Maak het model

Laten we een artikelentiteit modelleren om vast te houden aan onze realtime database.

public class-artikel public String title; public String auteur; public Article () // Standaardconstructor vereist voor oproepen naar DataSnapshot.getValue (Article.class) public Article (String-titel, String-auteur) this.title = title; this.author = auteur; 

Maak de XML-lay-out 

Onze XML-lay-out voor de hoofdactiviteit heeft er slechts twee EditTexts en slechts een knop die het nieuwe artikel zal indienen.

    

Schrijf naar de Realtime-database

Nu gaan we schrijven naar het Realtime Database-pad / Artikelen /.

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

Uw app heeft schrijftoegang tot de database nodig. Alleen voor demo-doeleinden kunt u uw beveiligingsregels instellen om alle lees- en schrijfbewerkingen toe te staan. In een echte applicatie zou je nooit zulke onveilige beveiligingsinstellingen willen gebruiken.

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

Je kunt meer leren over Firebase-beveiligingsregels in mijn post hier op Envato Tuts+.

Voer de app uit

In dit stadium kunnen we de app testen en zien of onze Cloud-functie met succes is uitgevoerd. Voer een titel en auteur in en klik vervolgens op de knop Verzenden. Bezoek daarna de functies dashboard en bekijk de logs. Ons aangepaste logboek zou moeten verschijnen.

Uit de logboeken hierboven zien we dat we onze Cloud-functie met succes hebben uitgevoerd en een bericht met een payload hebben verzonden naar apparaten die geabonneerd zijn op de 'android'onderwerp, maar nog geen apparaat heeft zich op het onderwerp geabonneerd. In de volgende sectie gebruiken we Firebase Cloud Messaging zodat apparaten zich kunnen abonneren op een onderwerp en vervolgens het inkomende bericht van de server kunnen verwerken om een ​​melding weer te geven. 

3. Voeg ondersteuning voor Firebase Cloud Messaging toe

Neem de afhankelijkheid op 

Voeg de afhankelijkheid van Firebase Messaging toe aan uw build.gradle bestand en synchroniseer je project achteraf:

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

Omgaan Berichten

We moeten een service maken die FirebaseMessagingService uitbreidt en de onMessageReceived callbacks. 

pakket com.chikeandroid.tutsplusalerts; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; importeer android.app.NotificationManager; importeer android.app.PendingIntent; importeer android.content.Context; importeer android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.support.v4.app.NotificationCompat; openbare klasse MyFirebaseMessagingService breidt FirebaseMessagingService uit @Override openbare ongeldig maken onMessageReceived (RemoteMessage remoteMessage) // Controleer of bericht een gegevenspayload bevat. if (remoteMessage.getData (). size ()> 0) showNotification (remoteMessage.getData (). get ("title"), remoteMessage.getData (). get ("auteur"));  // Controleer of het bericht een payload van de melding bevat. 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 / * Request code * /, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder (this) .setContentTitle ("New Article:" + 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 of notification * /, notificationBuilder.build ()); 

In de bovenstaande code krijgen we ook de payload van de gegevens en laten deze zien in een melding, ongeacht of de applicatie een voorgrond- of achtergrondstatus heeft.  

Werk het manifestbestand bij

Werk het manifestbestand bij, inclusief de service die eerder in de map is gemaakt label.

// ...      // ... 

Abonneer je op een onderwerp

Ten slotte moeten we ons abonneren op het onderwerp 'android'zodat het apparaat berichten die naar dat onderwerp zijn verzonden, kan ontvangen en verwerken. 

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

Voer de app uit 

Voer de app voor de tweede keer uit en voer een titel en een auteur in en klik vervolgens op de knop Verzenden. Deze keer verschijnt er een melding wanneer een nieuw artikel door elke app-gebruiker in de database wordt geplaatst.

Om dit voor Cloud Functions te doen, zou je een HTTP- of XMPP-server nodig hebben, wat meer code zou betekenen om te schrijven, evenals een server om in te stellen en te ondersteunen.

Conclusie

In deze zelfstudie hebt u geleerd over cloudfuncties voor Firebase: wat zijn deze, waarom hebt u ze nodig en hoe u aan de slag kunt gaan met Cloud Functions voor uw app. Houd er rekening mee dat Cloud Functions voor Firebase nog steeds in de publieke bèta is vanaf dit moment. 

Raadpleeg de officiële documentatie voor meer informatie over cloudfuncties voor Firebase. En bekijk in de tussentijd enkele van onze andere cursussen en zelfstudies over de ontwikkeling van Android-apps!