PWA гайд
Web Push уведомления
Как работают web push-подписки, зачем VAPID и чем iOS Safari отличается от Android Chrome.
Все материалы
1. Поток за минуту
- Запросите permission после понятного действия пользователя.
- Подпишитесь через PushManager + публичный VAPID-ключ.
- Отправьте subscription JSON на бэкенд.
- Сервер шлёт push, подписанный VAPID.
- Service Worker ловит
push и показывает уведомление.
2. Пример подписки
const permission = await Notification.requestPermission();
if (permission !== 'granted') return;
const reg = await navigator.serviceWorker.ready;
const sub = await reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(PUBLIC_VAPID_KEY),
});
await fetch('/api/push/subscribe', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(sub),
});
3. Обработчик push в SW
self.addEventListener('push', (event) => {
const data = event.data ? event.data.json() : {};
event.waitUntil(self.registration.showNotification(data.title || 'Update', {
body: data.body || '',
icon: '/icons/icon-192.png',
data: { url: data.url || '/' },
}));
});
self.addEventListener('notificationclick', (event) => {
event.notification.close();
const url = event.notification.data?.url || '/';
event.waitUntil(clients.openWindow(url));
});
4. Chrome vs iOS Safari
| Тема | Chrome / Android | Safari / iOS |
| Web Push | Зрелая поддержка | Есть на новых iOS, с лимитами |
| Установка на Home Screen | Полезно, не всегда обязательно | Обычно нужно для надёжного web push |
| Permission UX | Есть prompt | Строже; спрашивайте в контексте |
| Фоновая доставка | Обычно стабильна | Сильнее ограничена системой |
5. Практические правила
- Не спрашивайте push на первом экране.
- Объясните пользу до системного диалога.
- Храните подписки по устройствам и обрабатывайте истечение.
- Держите payload коротким; детали открывайте по URL.