Serverlose Apps mit Firebase Cloud-Funktionen

Das Ziel von Firebase ist es, Entwicklern dabei zu helfen, bessere Apps zu entwickeln und sie zu erfolgreichen Unternehmen zu entwickeln. Mit Firebase können Sie sich auf das Back-End oder die Infrastruktur Ihrer App konzentrieren, damit Sie sich auf die Lösung von Problemen für Ihre Benutzer konzentrieren können. Eine der neuen aufregenden Funktionen, die auf der Google Cloud Next '17-Konferenz im März für Firebase angekündigt wurden, waren Cloud Functions. In diesem Lernprogramm erfahren Sie mehr über diese neue Funktion, indem Sie eine einfache Android-App damit erstellen. 

Was sind Cloud-Funktionen für Firebase??

Firebase Cloud-Funktionen werden in einer gehosteten, privaten und skalierbaren Node.js-Umgebung ausgeführt, in der Sie JavaScript-Code ausführen können. Sie erstellen einfach reaktive Funktionen, die ausgelöst werden, wenn ein Ereignis auftritt. Cloud-Funktionen sind sowohl für die Google Cloud-Plattform als auch für Firebase verfügbar (sie wurden auf den Google Cloud-Funktionen aufgebaut).. 

Momentan unterstützen Cloud-Funktionen die folgenden Auslöser, die Sie hören und beantworten können:

  • Echtzeit-Datenbank-Trigger: Löst eine Funktion aus, wenn ein Schreibereignis in einem Pfad in einer Datenbank auftritt.
  • Authentifizierungsauslöser: Löst eine Funktion aus, wenn ein neuer Benutzer erstellt oder ein Benutzer gelöscht wird.
  • Analytics-Auslöser: Auslösen einer Funktion, wenn ein neues Konvertierungsereignis protokolliert wird.
  • Cloud-Speicherauslöser: Eine Funktion kann ausgelöst werden, wenn in einem Bucket Änderungen vorgenommen wurden, z. B. das Hochladen, Aktualisieren oder Löschen einer Datei oder eines Ordners.
  • Cloud Pub / Sub-Auslöser: Auslösen einer Funktion, wenn eine neue Nachricht in einem Google Cloud Pub / Sub-Thema empfangen wird.
  • HTTPS-Trigger: Wird ausgelöst, wenn eine Anforderung an einen Endpunkt gestellt wird.

Warum also Cloud-Funktionen nutzen??

Nun haben Sie die vielfältigen Funktionen der Cloud-Funktionen erkannt. Aber warum benutzen sie sie?? 

Das Ausführen und Einrichten eines Back-End und von Servern kann sehr schwierig sein. Sie müssen Probleme wie Skalierbarkeit und das Schreiben von Code in serverseitigen Sprachen behandeln. Bei Cloud-Funktionen wird diese Komplexität jedoch reduziert. Rechenintensive Aufgaben können auch in der Cloud statt auf dem Clientgerät ausgeführt werden (z. B. Ändern der Bildgröße für das Hochladen oder Schreiben in mehrere Pfade Ihrer Datenbank). Ihr Code ist außerdem in der Cloud sicherer als auf dem Clientgerät, sodass Sie Daten wie beispielsweise geheime Schlüssel auf Ihrem Server sicher speichern können. 

In diesem Lernprogramm erfahren Sie, wie Sie Echtzeit-Datenbankauslöser verwenden, die ausgelöst werden, wenn ein Datenbankschreibereignis auftritt. Anschließend erfahren Sie, wie Sie mit dem Firebase Cloud Messaging-Dienst eine Benachrichtigung an Geräte senden, die ein Thema abonniert haben. Wir erstellen eine einfache App namens Tutsplus Alarme, Diese sendet eine Benachrichtigung an Abonnenten des Themas "Android", sobald ein neuer Artikel verfügbar ist.

Voraussetzungen 

Um diesem Tutorial zu folgen, sollten Sie sich mit folgenden Themen auskennen:

  • Firebase-Echtzeitdatenbank
  • Firebase Cloud Messaging
  • Einrichten eines Firebase-Projekts

Sie sollten Node.js auf Ihrem Computer installiert haben.

In Envato Tuts + finden Sie die folgenden Tutorials, wenn Sie Hilfe bei der Installation von Firebase benötigen:

1. Erstellen Sie eine Firebase Cloud-Funktion

Installieren Sie die Firebase-CLI 

Jetzt, da die Voraussetzungen eingerichtet sind, laden wir Cloud-Funktionen herunter.

Um Cloud-Funktionen nutzen zu können, muss die Firebase-Befehlszeile (Befehlszeilenschnittstelle) von npm installiert werden. Wenn Sie bereits Node auf Ihrem Computer eingerichtet haben, können Sie Cloud-Funktionen mit folgendem Befehl installieren:

npm install -g firebase-tools

Dieser Befehl installiert die Firebase-CLI global zusammen mit allen erforderlichen Node.js-Abhängigkeiten.

Initialisieren Sie das Projekt

So initialisieren Sie Ihr Projekt:

  1. Lauf firebase login um sich über den Browser bei Firebase anzumelden und das CLI-Tool zu authentifizieren.
  2. Erstellen Sie ein neues Projektverzeichnis mit dem Namen tutsplus-Warnungen.
  3. Zum Schluss laufe Firebase-Init-Funktionen aus diesem neuen Verzeichnis. Mit diesem Tool können Sie Abhängigkeiten mit NPM installieren. Das Ablehnen ist sicher, wenn Sie Abhängigkeiten auf andere Weise verwalten möchten.

Nachdem diese Befehle erfolgreich ausgeführt wurden, sieht Ihre Projektstruktur folgendermaßen aus:

  • .Firebaserc: eine versteckte Datei, mit der Sie schnell zwischen Projekten wechseln können Firebase verwenden.
  • firebase.json: beschreibt Eigenschaften für Ihr Projekt.
  • Funktionen /: Dieser Ordner enthält den gesamten Code für Ihre Funktionen.
  • funktionen / package.json: Eine NPM-Paketdatei, die Ihre Cloud-Funktionen beschreibt.
  • Funktionen / index.js: die Hauptquelle für Ihren Cloud Functions-Code.
  • Funktionen / Knotenmodule /: Der Ordner, in dem alle NPM-Abhängigkeiten installiert sind.

Importieren Sie die benötigten Module und initialisieren Sie die App 

Für die Entwicklung unserer einfachen Tutsplus Alerts-App benötigen wir nur zwei Knotenmodule: Cloud-Funktionen und Admin-SDK-Module (diese Module sind für uns bereits installiert). Also geh zum index.js und erfordern diese Module, und initialisieren Sie dann eine Instanz der Administratoranwendung.

var-Funktionen = erfordern ('Firebase-Funktionen'); var admin = required ('firebase-admin'); admin.initializeApp (functions.config (). firebase);

Kodieren Sie die Cloud-Funktion

Nachdem nun die erforderlichen Module für unser Projekt importiert und initialisiert wurden, lasst uns unsere Cloud-Funktion in der index.js Datei. Wie bereits erwähnt, werden wir eine Funktion schreiben, die ausgelöst wird, wenn ein onWrite () Das Ereignis tritt in unserer Firebase-Echtzeitdatenbank auf und sendet daraufhin eine Benachrichtigung (eine nachgelagerte Nachricht) an die Geräteabonnenten.

//… exports.sendNotification = functions.database.ref ('/ articles / articleId') .onWrite (event => // Nimm den aktuellen Wert der Daten in die Echtzeitdatenbank. Var eventSnapshot = event.data ; var str1 = "Autor ist"; var str = str1.concat (eventSnapshot.child ("author"). val ()); console.log (str); var topic = "android"; var payload = data: title: eventSnapshot.child ("title"). val (), Autor: eventSnapshot.child ("author"). val (); // Sendet eine Nachricht an Geräte, die das bereitgestellte Thema abonniert haben. return admin.messaging () .sendToTopic (Topic, Payload) .then (Funktion (Antwort) // In der Referenzdokumentation zu MessagingTopicResponse finden Sie den // Inhalt der Antwort. console.log ("Erfolgreich gesendete Nachricht:", Antwort);) .catch (Funktion (Fehler) console.log ("Fehler beim Senden der Nachricht:", Fehler);););

Im obigen Code hören wir den Datenbankpfad / articles / articleId, woher articleId steht für die ID des Artikels, der erfolgreich geschrieben wurde. Nun geht es uns wirklich um die Daten, die geschrieben wurden. Um das zu bekommen, benutzen wir event.data, Dies ist eine statische DeltaSnapshot-Schnittstelle. 

Fügen Sie anschließend Daten aus diesem Snapshot zu einer Nachrichtennutzlast hinzu und senden Sie sie an das Thema "Android". Der asynchrone Code wird durch JavaScript-Versprechen vereinfacht. 

Beachten Sie, dass wir im obigen Code mithilfe von in die Konsole geschrieben haben console.log (), was uns beim debuggen und überwachen helfen wird. Wir können dieses Protokoll entweder in unserem Firebase-Dashboard oder über die Befehlszeile anzeigen: 

Firebase-Funktionen: Protokoll

Beachten Sie, dass Sie, da dies auf Node.js ausgeführt wird, andere von NPM verfügbare Module installieren können. Sie können auch in JavaScript ES6 oder TypeScript anstelle von Vanilla-JavaScript schreiben. 

Stellen Sie die Cloud-Funktion bereit

Lassen Sie uns unsere Cloud-Funktion bereitstellen. Führen Sie diesen Befehl für die Bereitstellung aus:

$ firebase deploy - nur Funktionen

Jetzt können wir die Android-App kodieren, die das Thema abonnieren wird, in die Echtzeitdatenbank schreiben und eine Benachrichtigung erhalten, wenn Daten in unsere Echtzeitdatenbank geschrieben werden. Dann wird unsere Cloud-Funktion ausgeführt! 

2. Erstellen Sie die TutsplusAlerts-App

Erstellen Sie ein Android Studio-Projekt

Starten Sie zunächst Android Studio und erstellen Sie ein neues Projekt "TutsplusAlerts"mit einer leeren Aktivität aufgerufen Hauptaktivität.

Vergewissern Sie sich, dass Sie Firebase in Ihre App integriert haben. 

Fügen Sie die Echtzeit-Datenbankabhängigkeit hinzu

Fügen Sie die folgende Abhängigkeit zu Ihrem hinzu build.gradle Datei:

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

Stellen Sie sicher, dass Sie Ihr Projekt synchronisieren, nachdem Sie es hinzugefügt haben.

Erstellen Sie das Modell

Lassen Sie uns ein Artikelelement modellieren, das in unserer Echtzeitdatenbank gespeichert werden soll.

öffentliche Klasse Artikel public String title; public Zeichenkettenautor; public Article () // Standardkonstruktor für Aufrufe von DataSnapshot.getValue (Article.class) erforderlich. public Artikel (String title, String author) this.title = title; this.author = Autor; 

Erstellen Sie das XML-Layout 

Unser XML-Layout für die Hauptaktivität wird nur zwei umfassen EditTexts und nur eine Schaltfläche, die den neuen Artikel einreichen wird.

    

Schreiben Sie in die Echtzeitdatenbank

Jetzt schreiben wir in den Pfad der Echtzeitdatenbank /Artikel/.

//… @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); endgültige FirebaseDatabase-Datenbank = 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 (neuer View.OnClickListener () @Override public void onClick (Ansicht)) DatabaseReference myRef = database.getReference ("articles"). push (); (), authorEditText.getText (). toString ()); myRef.setValue (article););  //… 

Ihre App benötigt Schreibzugriff auf die Datenbank. Nur zu Demonstrationszwecken können Sie Ihre Sicherheitsregeln festlegen, um alle Lese- und Schreibvorgänge zuzulassen. In einer realen Anwendung möchten Sie niemals solche unsicheren Sicherheitseinstellungen verwenden.

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

Weitere Informationen zu den Firebase-Sicherheitsregeln finden Sie hier in Envato Tuts+.

Führen Sie die App aus

In dieser Phase können wir die App testen und sehen, ob unsere Cloud-Funktion erfolgreich ausgeführt wurde. Geben Sie einen Titel und einen Autor ein und klicken Sie auf die Schaltfläche "Senden". Danach besuchen Sie die Funktionen Dashboard und zeigen Sie die Protokolle an. Unser benutzerdefiniertes Protokoll sollte angezeigt werden.

Aus den Protokollen oben sehen wir, dass wir unsere Cloud-Funktion erfolgreich ausgeführt haben und eine Nachricht mit einer Nutzlast an Geräte gesendet haben, die den 'Android'topic, aber noch kein Gerät hat das Thema abonniert. Im nächsten Abschnitt verwenden wir Firebase Cloud Messaging, damit Geräte ein Thema abonnieren und die eingehende Nachricht vom Server verarbeiten können, um eine Benachrichtigung anzuzeigen. 

3. Fügen Sie die Unterstützung für Firebase Cloud Messaging hinzu

Schließen Sie die Abhängigkeit ein 

Fügen Sie die Firebase Messaging-Abhängigkeit in Ihre ein build.gradle Datei und synchronisieren Sie anschließend Ihr Projekt:

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

Umgang mit Nachrichten

Wir müssen einen Dienst erstellen, der FirebaseMessagingService erweitert und den Server überschreibt onMessageReceived Rückrufe. 

Paket com.chikeandroid.tutsplusalerts; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; importieren android.media.RingtoneManager; import android.net.Uri; import android.support.v4.app.NotificationCompat; public class MyFirebaseMessagingService erweitert FirebaseMessagingService @Override public void onMessageReceived (RemoteMessage remoteMessage) // Prüfen Sie, ob die Nachricht eine Datennutzlast enthält. if (remoteMessage.getData (). size ()> 0) showNotification (remoteMessage.getData (). get ("title"), remoteMessage.getData (). get ("author"));  // Prüfen Sie, ob die Nachricht eine Benachrichtigungsnutzlast enthält. if (remoteMessage.getNotification ()! = null)  private void showNotification (String-Titel, String-Autor) Intent Intent = New Intent (this, MainActivity.class); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity (this, 0 / * Anforderungscode * /, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder (this) .setContentTitle ("Neuer Artikel:" + title) .setSmallIcon (R.mipmap.ic_launcher) .setContentText ("By" + author) .setAutoCancel (true) ) .setContentIntent (pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService (Context.NOTIFICATION_SERVICE); notificationManager.notify (0 / * ID der Benachrichtigung * /, notificationBuilder.build ()); 

Im obigen Code erhalten wir auch die Datennutzlast und zeigen sie in einer Benachrichtigung an, unabhängig davon, ob sich die Anwendung im Vordergrund oder Hintergrund befindet.  

Aktualisieren Sie die Manifestdatei

Aktualisieren Sie die Manifestdatei einschließlich des zuvor erstellten Dienstes in Etikett.

//…      //… 

Abonnieren Sie ein Thema

Schließlich müssen wir das Thema abonnieren. 'Android', damit das Gerät an dieses Thema gesendete Nachrichten empfangen und verarbeiten kann. 

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

Führen Sie die App aus 

Führen Sie die App zum zweiten Mal aus, geben Sie einen Titel und einen Autor ein und klicken Sie auf die Schaltfläche "Senden". Diesmal wird eine Benachrichtigung angezeigt, wenn ein App-Benutzer einen neuen Artikel in die Datenbank stellt.

Um dies zu tun, benötigen Sie vor den Cloud-Funktionen einen HTTP- oder XMPP-Server, der mehr Code zum Schreiben benötigt, sowie einen Server, der eingerichtet und unterstützt werden muss.

Fazit

In diesem Lernprogramm haben Sie die Cloud-Funktionen für Firebase kennengelernt: Was sind diese, warum benötigen Sie sie und wie werden Cloud-Funktionen für Ihre App verwendet? Beachten Sie, dass sich Cloud-Funktionen für Firebase derzeit noch in der öffentlichen Beta-Phase befinden. 

Weitere Informationen zu Cloud-Funktionen für Firebase finden Sie in der offiziellen Dokumentation. In der Zwischenzeit können Sie einige unserer anderen Kurse und Tutorials zur Entwicklung von Android-Apps ausprobieren!