Веб-пуш работает как цепочка из четырёх звеньев: браузер запрашивает у пользователя разрешение, создаёт подписку, наш сервер отправляет сообщение через push-сервис браузера, а сервис-воркер принимает его и показывает уведомление. Если порвалось любое звено, пуш не дойдёт, поэтому диагностику ведём по цепочке, от разрешения к показу.
Как работают пуши в PWA: цепочка целиком
- Разрешение. Страница просит у пользователя право показывать уведомления.
- Подписка. Браузер регистрирует устройство в push-сервисе и отдаёт нам объект подписки.
- Сервер. Мы сохраняем подписку и отправляем сообщение на адрес из неё.
- Сервис-воркер. Он получает событие и показывает уведомление.
Формат и настройка описаны в общем гайде по web push уведомлениям, платформенные особенности Android — в разборе пушей из PWA на Android.
Шаг 1. Запрос разрешения на уведомления
Разрешение имеет три состояния: «не спрашивали», «разрешено» и «запрещено». Пока пользователь не ответил, можно показать системный запрос. После отказа состояние «запрещено» из кода не отменить: повторный вызов ничего не покажет. Вернуть пуши может только сам пользователь через настройки сайта или приложения.
Поэтому системный запрос — по сути одна попытка, и тратить её нужно осознанно.
Шаг 2. Подписка: что создаёт браузер
После согласия страница через сервис-воркер оформляет подписку. Результат — объект, в котором есть:
- адрес конечной точки (endpoint) в push-сервисе конкретного браузера;
- ключи шифрования, которыми защищается содержимое сообщения.
Также нужен публичный ключ нашего сервера (VAPID): по нему push-сервис понимает, что сообщения шлёт именно тот сервер, для которого оформлена подписка. Объект подписки отправляем на бэкенд и храним в связке с пользователем.
Шаг 3. Сервер отправляет, push-сервис доставляет
Сервер не обращается к браузеру напрямую. Он делает запрос на endpoint из подписки, подписывает его приватным VAPID-ключом и шифрует данные. Push-сервис принимает сообщение и держит его, пока устройство не появится в сети, в пределах заданного нами времени жизни.
Шаг 4. Сервис-воркер показывает уведомление
Воркер получает событие push и вызывает показ уведомления. Он работает отдельно от страницы, поэтому уведомление приходит и при закрытой вкладке. Клик обрабатываем событием notificationclick: открываем нужный экран или фокусируем уже открытое окно. Регистрация и обновление воркера описаны в материале про манифест и сервис-воркер.
Когда просить разрешение на уведомления
Правило: сначала ценность, потом запрос. Системный запрос на первом экране почти всегда преждевременен: пользователь ещё не понял, зачем ему пуши.
Мягкое предварительное окно. Перед системным запросом показываем свой экран с объяснением, что именно придёт. Если пользователь отказывается там, системная попытка остаётся нетронутой.
После отказа. Не давим повторами. Достаточно подсказки в интерфейсе, как включить уведомления в настройках.
| Момент запроса | Риск | Вердикт |
|---|---|---|
| Сразу при загрузке | Высокий шанс отказа, попытка сгорает | Не делаем |
| После установки PWA | Пользователь уже проявил интерес | Нормально, с предварительным окном |
| После целевого действия (например, подписка на статус заказа) | Польза очевидна | Лучший вариант |
| Повтор после отказа | Раздражение, жалобы | Только мягкая подсказка |
На iPhone пуши работают только из PWA, установленной на экран «Домой», поэтому запрос привязываем к установке. Подробности — в гайде по PWA на iPhone.
Почему пуши не доходят
Диагностика по схеме «симптом → причина → что делать».
Подписка
- Симптом: push-сервис отвечает, что подписка не найдена или удалена. Причина: она просрочена или отозвана. Что делать: удалять такие записи и не слать на них повторно.
- Симптом: пользователь сменил браузер или переустановил PWA. Причина: подписка привязана к прежней установке. Что делать: оформить новую при следующем визите.
Сервер
- Неверная пара VAPID-ключей: публичный ключ при подписке и приватный при отправке должны совпадать.
- Ошибки шифрования или неверный формат данных: push-сервис отклоняет запрос.
- Слишком короткое время жизни сообщения: если устройство было офлайн, оно истекает.
Устройство и браузер
- Экономия заряда и фоновые ограничения могут задерживать доставку.
- Режим «не беспокоить» скрывает доставленное уведомление.
- На iOS пуши работают только в установленной PWA.
- В отдельных оболочках и встроенных браузерах поддержка может отсутствовать, подробнее в разделе про webview.
Сервис-воркер
- Воркер не зарегистрирован или остался старой версии.
- Обработчик
pushне вызывает показ уведомления, и браузер может показать служебное сообщение или скрыть его. - Ошибка в обработчике обрывает показ без видимых следов.
Пошаговая проверка — в диагностике, когда пуши из PWA не приходят.
Как проверить, что цепочка работает
- Проверяем состояние разрешения в настройках сайта.
- Убеждаемся, что воркер зарегистрирован и активен (вкладка приложения в инструментах разработчика).
- Проверяем, что подписка сохранена на сервере и endpoint не пустой.
- Отправляем тестовое сообщение себе и смотрим код ответа push-сервиса.
- Вызываем событие
pushвручную в инструментах разработчика, чтобы отделить проблему показа от проблемы доставки.
Частые ошибки
- Запрос разрешения на первом экране без объяснения.
- Хранение подписок без чистки: база растёт, доставляемость падает.
- Тест только на одном браузере и одной платформе.
- Забытое обновление воркера после правок кода.
- Отправка без времени жизни сообщения и без обработки ответов сервиса.
Вопрос–ответ
Можно ли повторно показать системный запрос после отказа? Нет. Состояние «запрещено» из кода не сбросить. Остаётся подсказка, как включить уведомления в настройках.
Нужен ли сервис-воркер для пушей?
Да. Он принимает событие push и показывает уведомление, в том числе при закрытой вкладке.
Работают ли пуши на iPhone? Да, но только из PWA, установленной на экран «Домой». Установка описана в материале про PWA на iPhone.
Зачем нужны VAPID-ключи? Они подтверждают, что сообщения отправляет тот сервер, для которого оформлена подписка. Без них push-сервис может отклонять запросы.
Почему тестовый пуш пришёл, а боевой нет? Чаще всего дело в просроченной подписке, неверном формате данных или коротком времени жизни сообщения. Начинаем с кода ответа push-сервиса.
Где почитать про PWA в целом? В разделе Pwa собраны базовые материалы, включая объяснение, что такое PWA простыми словами.
Проверено: 30.10.2026. Правила сторов и возможности платформ описаны на дату проверки; точные формулировки смотрите в официальной справке Apple, Google и MDN. Нашли неточность — напишите на redakciya@pwa-arbitrazh.com.