In diesem Codelab erfahren Sie Schritt für Schritt, wie Sie einen Push-Benachrichtigungsserver erstellen. Am Ende des Codelabs haben Sie einen Server, der:
- Erfasst Push-Benachrichtigungsabonnements.Das bedeutet, dass der Server einen neuen Datenbankeintrag erstellt, wenn ein Client Push-Benachrichtigungen aktiviert, und einen vorhandenen Datenbankeintrag löscht, wenn ein Client sie deaktiviert.
- Sendet eine Push-Benachrichtigung an einen einzelnen Client.
- Sendet eine Push-Benachrichtigung an alle abonnierten Clients
In diesem Codelab geht es darum, durch praktisches Tun zu lernen. Konzepte werden nur am Rande behandelt. Unter Wie funktionieren Push-Benachrichtigungen? finden Sie weitere Informationen zu Push-Benachrichtigungen.
Der Clientcode für dieses Codelab ist bereits fertig. In diesem Codelab implementieren Sie nur den Server. Informationen zum Implementieren eines Push-Benachrichtigungsclients finden Sie in Codelab: Client für Push-Benachrichtigungen erstellen.
Den vollständigen Code finden Sie unter push-notifications-server-codelab-complete (Quelle).
Browserkompatibilität
Dieses Codelab funktioniert bekanntermaßen mit den folgenden Kombinationen aus Betriebssystemen und Browsern:
- Windows: Chrome, Edge
- macOS: Chrome, Firefox
- Android: Chrome, Firefox
Dieses Codelab funktioniert nicht mit den folgenden Betriebssystemen (oder Betriebssystem- und Browserkombinationen):
- macOS: Brave, Edge, Safari
- iOS
Anwendungspaket
- Der Server basiert auf Express.js.
- Die Node.js-Bibliothek web-push verarbeitet die gesamte Logik für Push-Benachrichtigungen.
- Abodaten werden mit lowdb in eine JSON-Datei geschrieben.
Sie müssen keine dieser Technologien verwenden, um Push-Benachrichtigungen zu implementieren. Wir haben diese Technologien ausgewählt, weil sie eine zuverlässige Codelab-Umgebung bieten.
Einrichtung
Bearbeitbare Kopie des Codes abrufen
Der Codeeditor, den Sie rechts neben dieser Anleitung sehen, wird in diesem Codelab als Glitch-UI bezeichnet.
- Klicke auf Remix zum Bearbeiten, um das Projekt bearbeitbar zu machen.
Authentifizierung einrichten
Bevor Sie Push-Benachrichtigungen verwenden können, müssen Sie Ihren Server und Client mit Authentifizierungsschlüsseln einrichten. Weitere Informationen finden Sie unter Web Push-Protokollanfragen signieren.
- Öffnen Sie das Glitch-Terminal, indem Sie auf Tools und dann auf Terminal klicken.
- Führen Sie im Terminal
npx web-push generate-vapid-keys
aus. Kopieren Sie die Werte für den privaten und den öffentlichen Schlüssel. - Öffne
.env
und aktualisiereVAPID_PUBLIC_KEY
undVAPID_PRIVATE_KEY
. Legen SieVAPID_SUBJECT
aufmailto:test@test.test
fest. Alle diese Werte müssen in doppelte Anführungszeichen gesetzt werden. Nachdem Sie die Aktualisierungen vorgenommen haben, sollte die Datei.env
in etwa so aussehen:
VAPID_PUBLIC_KEY="BKiwTvD9HA…"
VAPID_PRIVATE_KEY="4mXG9jBUaU…"
VAPID_SUBJECT="mailto:test@test.test"
- Schließe das Glitch-Terminal.
- Öffnen Sie
public/index.js
. - Ersetzen Sie
VAPID_PUBLIC_KEY_VALUE_HERE
durch den Wert Ihres öffentlichen Schlüssels.
Abos verwalten
Dein Kunde übernimmt den Großteil des Aboprozesses. Ihr Server muss vor allem neue Push-Benachrichtigungsabos speichern und alte Abos löschen. Über diese Abos können Sie in Zukunft Nachrichten an Clients senden. Weitere Informationen zum Aboprozess findest du unter Client für Push-Benachrichtigungen registrieren.
Neue Aboinformationen speichern
- Wenn Sie sich eine Vorschau der Website ansehen möchten, drücken Sie App ansehen und dann Vollbild .
- Klicken Sie auf dem Tab „App“ auf Dienstworker registrieren. Im Statusfeld sollte eine Meldung ähnlich der folgenden angezeigt werden:
Service worker registered. Scope: https://desert-cactus-sunset.glitch.me/
- Klicken Sie auf dem Tab „App“ auf Push-Benachrichtigungen abonnieren. Ihr Browser oder Betriebssystem wird Sie wahrscheinlich fragen, ob Sie der Website erlauben möchten, Ihnen Push-Benachrichtigungen zu senden. Klicken Sie auf Zulassen (oder auf die entsprechende Option in Ihrem Browser/Betriebssystem). Im Statusfeld sollte eine Meldung wie die folgende angezeigt werden:
Service worker subscribed to push. Endpoint: https://fcm.googleapis.com/fcm/send/…
- Klicken Sie in der Glitch-Benutzeroberfläche auf Quellcode ansehen, um zum Code zurückzukehren.
- Öffne die Glitch-Protokolle, indem du auf Tools und dann auf Protokolle klickst. Sie sollten
/add-subscription
gefolgt von einigen Daten sehen./add-subscription
ist die URL, an die der Client eine POST-Anfrage sendet, wenn er Push-Benachrichtigungen abonnieren möchte. Die folgenden Daten sind die Aboinformationen des Kunden, die du speichern musst. - Öffnen Sie
server.js
. - Aktualisieren Sie die Logik des
/add-subscription
-Routen-Handlers mit dem folgenden Code:
app.post('/add-subscription', (request, response) => {
console.log('/add-subscription');
console.log(request.body);
console.log(`Subscribing ${request.body.endpoint}`);
db.get('subscriptions')
.push(request.body)
.write();
response.sendStatus(200);
});
Alte Aboinformationen löschen
- Kehren Sie zum Tab „App“ zurück.
- Klicken Sie auf Push-Benachrichtigungen deaktivieren.
- Sehen Sie sich die Glitch-Protokolle noch einmal an. Du solltest
/remove-subscription
und dann die Aboinformationen des Kunden sehen. - Aktualisieren Sie die Logik des
/remove-subscription
-Routen-Handlers mit dem folgenden Code:
app.post('/remove-subscription', (request, response) => {
console.log('/remove-subscription');
console.log(request.body);
console.log(`Unsubscribing ${request.body.endpoint}`);
db.get('subscriptions')
.remove({endpoint: request.body.endpoint})
.write();
response.sendStatus(200);
});
Benachrichtigungen senden
Wie im Hilfeartikel Push-Nachricht senden erläutert, sendet Ihr Server die Push-Nachrichten nicht direkt an die Clients. Stattdessen wird ein Push-Dienst verwendet. Ihr Server startet im Grunde nur den Prozess zum Senden von Nachrichten an Clients, indem er Webanfrageanfragen (Web Push Protocol-Anfragen) an einen Webdienst (den Push-Dienst) sendet, der dem Browseranbieter gehört, den Ihr Nutzer verwendet.
- Aktualisieren Sie die Logik des
/notify-me
-Routen-Handlers mit dem folgenden Code:
app.post('/notify-me', (request, response) => {
console.log('/notify-me');
console.log(request.body);
console.log(`Notifying ${request.body.endpoint}`);
const subscription =
db.get('subscriptions').find({endpoint: request.body.endpoint}).value();
sendNotifications([subscription]);
response.sendStatus(200);
});
- Aktualisieren Sie die
sendNotifications()
-Funktion mit dem folgenden Code:
function sendNotifications(subscriptions) {
// TODO
// Create the notification content.
const notification = JSON.stringify({
title: "Hello, Notifications!",
options: {
body: `ID: ${Math.floor(Math.random() * 100)}`
}
});
// Customize how the push service should attempt to deliver the push message.
// And provide authentication information.
const options = {
TTL: 10000,
vapidDetails: vapidDetails
};
// Send a push message to each client specified in the subscriptions array.
subscriptions.forEach(subscription => {
const endpoint = subscription.endpoint;
const id = endpoint.substr((endpoint.length - 8), endpoint.length);
webpush.sendNotification(subscription, notification, options)
.then(result => {
console.log(`Endpoint ID: ${id}`);
console.log(`Result: ${result.statusCode}`);
})
.catch(error => {
console.log(`Endpoint ID: ${id}`);
console.log(`Error: ${error} `);
});
});
}
- Aktualisieren Sie die Logik des
/notify-all
-Routen-Handlers mit dem folgenden Code:
app.post('/notify-all', (request, response) => {
console.log('/notify-all');
response.sendStatus(200);
console.log('Notifying all subscribers');
const subscriptions =
db.get('subscriptions').cloneDeep().value();
if (subscriptions.length > 0) {
sendNotifications(subscriptions);
response.sendStatus(200);
} else {
response.sendStatus(409);
}
});
- Kehren Sie zum Tab „App“ zurück.
- Klicken Sie auf Push-Benachrichtigungen deaktivieren und dann noch einmal auf Push-Benachrichtigungen aktivieren. Das ist nur notwendig, weil Glitch das Projekt jedes Mal neu startet, wenn Sie den Code bearbeiten, und das Projekt so konfiguriert ist, dass die Datenbank beim Start gelöscht wird.
- Klicken Sie auf Mich benachrichtigen. Sie sollten eine Push-Benachrichtigung erhalten. Der Titel sollte
Hello, Notifications!
und der TextkörperID: <ID>
sein, wobei<ID>
eine Zufallszahl ist. - Öffnen Sie Ihre App in anderen Browsern oder auf anderen Geräten und versuchen Sie, sich für Push-Benachrichtigungen anzumelden und dann auf die Schaltfläche Alle benachrichtigen zu klicken. Sie sollten dieselbe Benachrichtigung auf allen abonnierten Geräten erhalten. Das heißt, die ID im Text der Push-Benachrichtigung sollte dieselbe sein.
Nächste Schritte
- Ein tieferes konzeptionelles Verständnis der Funktionsweise von Push-Benachrichtigungen finden Sie unter Push-Benachrichtigungen – Übersicht.
- Im Codelab „Client für Push-Benachrichtigungen erstellen“ erfahren Sie, wie Sie einen Client erstellen, der die Benachrichtigungsberechtigung anfordert, das Gerät für den Empfang von Push-Benachrichtigungen abonniert und einen Dienst-Worker verwendet, um Push-Nachrichten zu empfangen und als Benachrichtigungen anzuzeigen.