Dzięki temu ćwiczeniu w Codelabs dowiesz się, jak krok po kroku utworzyć klienta powiadomień push. Na koniec tego ćwiczenia będziesz mieć klienta, który:
- Subskrybuje powiadomienia push.
- Odbiera wiadomości push i wyświetla je jako powiadomienia.
- Anuluje subskrypcję powiadomień push.
Ten warsztat programistyczny ma na celu pomóc Ci w nauce poprzez działanie i nie skupia się na omawianiu pojęć. Aby dowiedzieć się więcej o pojęciach związanych z powiadomieniami push, przeczytaj artykuł Jak działają powiadomienia push?
Kod serwera w tym ćwiczeniu jest już gotowy. W tym ćwiczeniu będziesz wdrażać tylko klienta. Aby dowiedzieć się, jak wdrożyć serwer powiadomień push, zapoznaj się z Codelab: tworzenie serwera powiadomień push.
Aby zobaczyć pełny kod, otwórz push-notifications-client-codelab-complete (kod źródłowy).
Zgodność z przeglądarką
To Codelab działa w tych kombinacjach systemów operacyjnych i przeglądarek:
- Windows: Chrome, Edge
- macOS: Chrome, Firefox
- Android: Chrome, Firefox
Wiemy, że te ćwiczenia w Codelabs nie działają w następujących systemach operacyjnych (ani ich kombinacjach systemu operacyjnego i przeglądarki):
- macOS: Brave, Edge, Safari.
- iOS
Konfiguracja
Pobieranie edytowalnej kopii kodu
W tym samouczku edytor kodu widoczny po prawej stronie tych instrukcji będzie nazywany interfejsem Glitch.
- Aby udostępnić projekt do edycji, kliknij Remiksuj, aby edytować.
Konfigurowanie uwierzytelniania
Zanim zaczniesz korzystać z powiadomień push, musisz skonfigurować serwer i klienta za pomocą kluczy uwierzytelniających. Aby dowiedzieć się, dlaczego tak się dzieje, przeczytaj artykuł Podpisywanie żądań protokołu web push.
- W interfejsie Glitch API kliknij Narzędzia, a następnie Terminal, aby otworzyć terminal zakłócenia.
- W terminalu Glitch uruchom
npx web-push generate-vapid-keys
. Skopiuj wartości klucza prywatnego i klucza publicznego. - W interfejsie błędu otwórz plik
.env
i zaktualizujVAPID_PUBLIC_KEY
orazVAPID_PRIVATE_KEY
. UstawVAPID_SUBJECT
namailto:test@test.test
. Wszystkie te wartości musisz umieścić w cudzysłowie. Po wprowadzeniu zmian plik.env
powinien wyglądać tak:
VAPID_PUBLIC_KEY="BKiwTvD9HA…"
VAPID_PRIVATE_KEY="4mXG9jBUaU…"
VAPID_SUBJECT="mailto:test@test.test"
- Zamknij Glitch Terminal.
- Otwórz pokój
public/index.js
. - Zastąp
VAPID_PUBLIC_KEY_VALUE_HERE
wartością klucza publicznego.
Rejestrowanie skryptu service worker
Ostatecznie klient będzie potrzebować service workera do odbierania i wyświetlania powiadomień. Najlepiej zarejestrować service workera jak najszybciej. Więcej informacji znajdziesz w sekcji Odbieranie i wyświetlanie przekazanych wiadomości jako powiadomień.
- Zastąp komentarz
// TODO add startup logic here
tym kodem:
// TODO add startup logic here
if ('serviceWorker' in navigator && 'PushManager' in window) {
navigator.serviceWorker.register('./service-worker.js').then(serviceWorkerRegistration => {
console.info('Service worker was registered.');
console.info({serviceWorkerRegistration});
}).catch(error => {
console.error('An error occurred while registering the service worker.');
console.error(error);
});
subscribeButton.disabled = false;
} else {
console.error('Browser does not support service workers or push messages.');
}
subscribeButton.addEventListener('click', subscribeButtonHandler);
unsubscribeButton.addEventListener('click', unsubscribeButtonHandler);
- Aby wyświetlić podgląd strony, kliknij Wyświetl aplikację. Następnie kliknij Pełny ekran.
- Aby otworzyć Narzędzia dla programistów, naciśnij `Control+Shift+J` (lub `Command+Option+J` na Macu).
- Kliknij kartę Konsola. W Konsoli powinien pojawić się komunikat
Service worker was registered.
.
Prośba o zgodę na wyświetlanie powiadomień push
Nigdy nie proś o zgodę na wysyłanie powiadomień push podczas wczytywania strony. Zamiast tego interfejs użytkownika powinien pytać, czy chce otrzymywać powiadomienia push. Gdy użytkownik wyraźnie potwierdzi (np. kliknięciem przycisku), możesz rozpocząć formalny proces uzyskania uprawnień do wysyłania powiadomień push z przeglądarki.
- Aby wrócić do kodu, w interfejsie Glitch kliknij Wyświetl źródło.
- W pliku
public/index.js
zastąp komentarz// TODO
w plikusubscribeButtonHandler()
tym kodem:
// TODO
// Prevent the user from clicking the subscribe button multiple times.
subscribeButton.disabled = true;
const result = await Notification.requestPermission();
if (result === 'denied') {
console.error('The user explicitly denied the permission request.');
return;
}
if (result === 'granted') {
console.info('The user accepted the permission request.');
}
- Wróć do karty aplikacji i kliknij Subskrybuj powiadomienia push. Przeglądarka lub system operacyjny prawdopodobnie zapyta, czy chcesz otrzymywać powiadomienia push z witryny. Kliknij Zezwól (lub inną odpowiednią frazę używaną przez Twoją przeglądarkę lub system operacyjny). W konsoli powinien pojawić się komunikat informujący, czy prośba została zaakceptowana, czy odrzucona.
Subskrybuj powiadomienia push
Proces subskrypcji wymaga interakcji z usługą internetową kontrolowaną przez dostawcę przeglądarki, zwaną usługą push. Gdy otrzymasz informacje o subskrypcji powiadomień push, musisz je wysłać na serwer, a następnie umożliwić mu przechowywanie ich w bazie danych przez długi czas. Aby dowiedzieć się więcej o procesie subskrypcji, przeczytaj artykuł Subskrypcja powiadomień push przez klienta.
- Dodaj do pliku
subscribeButtonHandler()
ten wyróżniony kod:
subscribeButton.disabled = true;
const result = await Notification.requestPermission();
if (result === 'denied') {
console.error('The user explicitly denied the permission request.');
return;
}
if (result === 'granted') {
console.info('The user accepted the permission request.');
}
const registration = await navigator.serviceWorker.getRegistration();
const subscribed = await registration.pushManager.getSubscription();
if (subscribed) {
console.info('User is already subscribed.');
notifyMeButton.disabled = false;
unsubscribeButton.disabled = false;
return;
}
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlB64ToUint8Array(VAPID_PUBLIC_KEY)
});
notifyMeButton.disabled = false;
fetch('/add-subscription', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(subscription)
});
Opcja userVisibleOnly
musi mieć wartość true
. Może się zdarzyć, że pewnego dnia będzie można wysyłać wiadomości bez wyświetlania powiadomień widocznych dla użytkownika (cicha wysyłka), ale obecnie przeglądarki nie umożliwiają takiej funkcji ze względu na kwestie związane z prywatnością.
Wartość applicationServerKey
korzysta z funkcji użytkowej, która przekształca ciąg base64 w tablicę Uint8tablica. Ta wartość służy do uwierzytelniania między serwerem a usługą push.
Anulowanie subskrypcji powiadomień push
Po zasubskrybowaniu powiadomień push interfejs użytkownika musi umożliwiać anulowanie subskrypcji w przypadku, gdy zmieni zdanie i nie będzie chciał już otrzymywać powiadomień push.
- Zastąp komentarz
// TODO
w plikuunsubscribeButtonHandler()
tym kodem:
// TODO
const registration = await navigator.serviceWorker.getRegistration();
const subscription = await registration.pushManager.getSubscription();
fetch('/remove-subscription', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({endpoint: subscription.endpoint})
});
const unsubscribed = await subscription.unsubscribe();
if (unsubscribed) {
console.info('Successfully unsubscribed from push notifications.');
unsubscribeButton.disabled = true;
subscribeButton.disabled = false;
notifyMeButton.disabled = true;
}
Odbieraj wiadomości push i wyświetlaj je jako powiadomienia
Jak już wspomnieliśmy, do obsługiwania odbierania i wyświetlania wiadomości wysyłanych na klienta z serwera potrzebny jest Ci serwis worker. Więcej informacji znajdziesz w artykule Odbieranie i wyświetlanie wiadomości push jako powiadomień.
- Otwórz plik
public/service-worker.js
i w obiekcie service worker zastąp komentarz// TODO
w obiekciepush
obsługującym zdarzenie tym kodem:
// TODO
let data = event.data.json();
const image = 'https://cdn.glitch.com/614286c9-b4fc-4303-a6a9-a4cef0601b74%2Flogo.png?v=1605150951230';
const options = {
body: data.options.body,
icon: image
}
self.registration.showNotification(
data.title,
options
);
- Wróć na kartę aplikacji.
- Kliknij Powiadamiaj mnie. Otrzymasz powiadomienie push.
- Spróbuj otworzyć adres URL karty aplikacji w innych przeglądarkach (lub na innych urządzeniach), przejść przez proces subskrypcji, a następnie kliknąć Powiadomij wszystkich. Musisz otrzymywać to samo powiadomienie push we wszystkich przeglądarkach, które subskrybujesz. Aby zobaczyć listę kombinacji przeglądarek i systemów operacyjnych, które działają lub nie działają, zapoznaj się z artykułem Zgodność przeglądarki.
Powiadomienie możesz dostosować na wiele sposobów. Aby dowiedzieć się więcej, zapoznaj się z parametrami funkcji ServiceWorkerRegistration.showNotification()
.
Otwieranie adresu URL po kliknięciu powiadomienia przez użytkownika
W praktyce prawdopodobnie użyjesz powiadomienia, aby ponownie zaangażować użytkownika i zachęcić go do odwiedzenia witryny. Aby to zrobić, musisz trochę skonfigurować mechanizm Service Worker.
- Zastąp komentarz
// TODO
w obiekcienotificationclick
w obiekcienotificationclick
kodem:
// TODO
event.notification.close();
event.waitUntil(self.clients.openWindow('https://web.dev'));
- Wróć do karty aplikacji, wyślij do siebie kolejne powiadomienie, a potem kliknij to powiadomienie. Przeglądarka powinna otworzyć nową kartę i wczytać
https://web.dev
.
Dalsze kroki
- Aby dowiedzieć się, jak na różne sposoby możesz dostosowywać powiadomienia, zajrzyj na stronę
ServiceWorkerRegistration.showNotification()
. - Aby lepiej zrozumieć, jak działają powiadomienia push, przeczytaj omówienie powiadomień push.
- Aby dowiedzieć się, jak utworzyć serwer, który zarządza subskrypcjami i wysyła żądania protokołu web push, skorzystaj z tego ćwiczenia z programowania: tworzenie serwera powiadomień push.
- Wypróbuj Generator powiadomień, aby sprawdzić wszystkie sposoby dostosowywania powiadomień.