Z tego ćwiczenia w Codelabs dowiesz się krok po kroku, jak utworzyć klienta powiadomień push. Po ukończeniu tego ćwiczenia będziesz mieć klienta, który:
- Subskrybuje użytkownika w celu otrzymywania powiadomień push.
- Otrzymuje wiadomości push i wyświetla je jako powiadomienia.
- Anuluje subskrypcję powiadomień push użytkownika.
Ten przewodnik skupia się na nauce przez działanie i nie omawia zbyt wielu koncepcji. Przeczytaj artykuł Jak działają powiadomienia push, aby dowiedzieć się więcej o koncepcjach związanych z powiadomieniami push.
Kod serwera w tym ćwiczeniu jest już gotowy. W tym ćwiczeniu zaimplementujesz tylko klienta. Aby dowiedzieć się, jak wdrożyć serwer powiadomień push, zapoznaj się z kursem: Tworzenie serwera powiadomień push.
Zgodność z przeglądarką
Ten przewodnik działa w tych kombinacjach systemów operacyjnych i przeglądarek:
- Windows: Chrome, Edge
- macOS: Chrome, Firefox
- Android: Chrome, Firefox
Wiadomo, że te systemy operacyjne (lub kombinacje systemu operacyjnego i przeglądarki) nie działają z tym kursem:
- macOS: Brave, Edge, Safari
- iOS
Konfiguracja
Kliknij Remiks do edycji, aby umożliwić edytowanie projektu.
Konfigurowanie uwierzytelniania
Aby powiadomienia push działały, musisz skonfigurować serwer i klienta za pomocą kluczy uwierzytelniania.
Więcej informacji znajdziesz w artykule Podpisywanie żądań protokołu powiadomień push w internecie. Zwykle obiekty tajne są przechowywane w pliku .env, podobnie jak w tym przykładzie.
VAPID_PUBLIC_KEY="BKiwTvD9HA…"
VAPID_PRIVATE_KEY="4mXG9jBUaU…"
VAPID_SUBJECT="mailto:test@test.test"
- Otwórz pokój
public/index.js. - Zastąp
VAPID_PUBLIC_KEY_VALUE_HEREwartością klucza publicznego.
Rejestrowanie skryptu service worker
Aby klient mógł otrzymywać i wyświetlać powiadomienia, potrzebuje komponentu service worker. Najlepiej zarejestrować service worker jak najwcześniej. Więcej informacji znajdziesz w artykule Odbieranie i wyświetlanie wiadomości push jako powiadomień.
Zastąp komentarz
// TODO add startup logic heretym kodem: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);W Chrome otwórz konsolę Narzędzi deweloperskich.
W konsoli powinien pojawić się komunikat
Service worker was registered.logged to the Console.
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 powinien zapytać użytkownika, czy chce otrzymywać powiadomienia push. Gdy użytkownik wyraźnie potwierdzi zgodę (np. klikając przycisk), możesz rozpocząć formalny proces uzyskiwania od przeglądarki uprawnień do wysyłania powiadomień push.
W
public/index.jszastąp// TODOkomentarz wsubscribeButtonHandler()tym kodem:// 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óć na kartę aplikacji i kliknij Subskrybuj powiadomienia push. Przeglądarka lub system operacyjny zapyta, czy chcesz zezwolić witrynie na wysyłanie powiadomień push.
Kliknij Zezwól (lub odpowiednik w przeglądarce lub systemie operacyjnym). W konsoli powinien pojawić się komunikat informujący, czy prośba została zaakceptowana czy odrzucona.
Subskrybowanie powiadomień push
Proces subskrypcji obejmuje interakcję z usługą internetową kontrolowaną przez dostawcę przeglądarki, która jest nazywana usługą push. Po uzyskaniu informacji o subskrypcji powiadomień push musisz wysłać je na serwer i dopilnować, aby serwer zapisał je w bazie danych na stałe.
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. W przyszłości może być możliwe wysyłanie wiadomości bez wyświetlania powiadomień widocznych dla użytkownika (ciche wysyłanie), ale przeglądarki nie zezwalają na taką funkcję ze względu na ochronę prywatności.
Wartość applicationServerKey zależy od funkcji narzędziowej, która przekształca ciąg Base64 w tablicę Uint8Array. Ta wartość służy do uwierzytelniania między serwerem a usługą push.
Anulowanie subskrypcji powiadomień push
Gdy użytkownik zasubskrybuje powiadomienia push, interfejs musi umożliwiać rezygnację z subskrypcji, jeśli użytkownik zmieni zdanie i nie będzie już chciał otrzymywać powiadomień push.
- Zastąp komentarz
// TODOw plikuunsubscribeButtonHandler()tym kodem:
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;
}
Otrzymywanie wiadomości push i wyświetlanie jej jako powiadomienia
Jak już wspomnieliśmy, do obsługi odbierania i wyświetlania wiadomości wysłanych do klienta z serwera potrzebny jest service worker. Więcej informacji znajdziesz w artykule Odbieranie i wyświetlanie wiadomości push jako powiadomień.
Otwórz
public/service-worker.jsi zastąp// TODOkomentarz w procedurze obsługi zdarzeńpushw usłudze Service Worker tym kodem:let data = event.data.json(); const image = 'logo.png'; const options = { body: data.options.body, icon: image } self.registration.showNotification( data.title, options );Wróć do karty aplikacji.
Kliknij Powiadom mnie. Powinno pojawić się powiadomienie push.
Otwórz adres URL karty aplikacji w innych obsługiwanych przeglądarkach. Wykonaj kolejne czynności w procesie subskrypcji i kliknij Powiadom wszystkich. W każdym z nich powinno pojawić się to samo powiadomienie push.
Powiadomienie możesz dostosować na wiele sposobów. Więcej informacji znajdziesz w parametrach ServiceWorkerRegistration.showNotification().
Otwieranie adresu URL, gdy użytkownik kliknie powiadomienie
W rzeczywistości prawdopodobnie użyjesz powiadomienia, aby ponownie zaangażować użytkownika i zachęcić go do odwiedzenia Twojej witryny. Aby to zrobić, musisz nieco bardziej skonfigurować instancję roboczą usługi.
Zastąp komentarz
// TODOwnotificationclickobsłudze zdarzeń// TODOw usłudze Service Worker tym kodem:event.notification.close(); event.waitUntil(self.clients.openWindow('https://web.dev'));Wróć na kartę aplikacji, wyślij do siebie kolejne powiadomienie, a następnie kliknij je. W przeglądarce powinna otworzyć się nowa karta i załadować tekst
https://web.dev.
Dalsze kroki
- Więcej informacji o różnych sposobach dostosowywania powiadomień znajdziesz w sekcji
ServiceWorkerRegistration.showNotification(). - Aby lepiej zrozumieć, jak działają powiadomienia push, przeczytaj omówienie powiadomień push.
- Zapoznaj się z ćwiczeniami z programowania: Tworzenie serwera powiadomień push, aby dowiedzieć się, jak utworzyć serwer, który zarządza subskrypcjami i wysyła żądania protokołu powiadomień push w internecie.
- Wypróbuj generator powiadomień, aby sprawdzić wszystkie sposoby dostosowywania powiadomień.