Если вы столкнулись с проблемой, связанной с веб-пуш-уведомлениями, может быть сложно найти ее причину или получить помощь. В этом документе описаны некоторые распространенные проблемы и действия, которые следует предпринять, если вы обнаружили ошибку в Chrome или Firefox.
Прежде чем мы углубимся в отладку push-уведомлений, вы можете столкнуться с проблемами при отладке самих сервис-воркеров, когда файл не обновляется, не регистрируется или вообще ведет себя необычно. Если вы только начинаете работать с сервис-воркерами, рекомендуем ознакомиться с документом об их отладке.
При разработке и тестировании веб-push-уведомлений есть два отдельных этапа, каждый из которых имеет свой набор распространенных проблем:
- Отправка сообщения. Убедитесь, что сообщения отправляются успешно.
Вы должны получить код HTTP 201. Если вы не являетесь:
- Проверьте, нет ли ошибок авторизации. Если вы получили сообщение об ошибке авторизации, ознакомьтесь с разделом Проблемы с авторизацией.
- Другие ошибки API. Если вы получили ответ с кодом статуса, отличным от 201, ознакомьтесь с разделом о кодах статуса HTTP, чтобы узнать причину проблемы.
- Получение сообщения. Если вы можете отправить сообщение, но оно не доходит до браузера:
- Проверьте, нет ли проблем с шифрованием. См. раздел Проблемы с шифрованием полезной нагрузки.
- Проверьте подключение к интернету. Если проблема возникает в Chrome, возможно, она связана с подключением. Подробнее о проблемах с подключением…
Если вы не можете отправлять и получать push-сообщения, а разделы этой статьи не помогают устранить проблему, возможно, вы обнаружили ошибку в самом механизме push-уведомлений. В этом случае ознакомьтесь с разделом Как составить отчет об ошибке, чтобы предоставить всю необходимую информацию и ускорить процесс исправления ошибок.
Прежде чем мы начнем, я хотел бы отметить, что Firefox и служба Mozilla AutoPush Service имеют отличные сообщения об ошибках. Если вы застряли и не уверены, в чем проблема, то протестируйте в Firefox и посмотрите, получите ли вы более полезное сообщение об ошибке.
Проблемы с авторизацией
Проблемы с авторизацией – одни из самых распространенных, с которыми сталкиваются разработчики, когда начинают работать с веб-push-уведомлениями. Обычно это связано с конфигурацией ключей сервера приложений (также известных как ключи VAPID) .
Проще всего обеспечить поддержку push-уведомлений в Firefox и Chrome, указав applicationServerKey в вызове subscribe(). Недостаток заключается в том, что любое несоответствие между ключами интерфейса и сервера приведет к ошибке авторизации.
В Chrome и FCM
Для Chrome, который использует FCM в качестве сервиса push-уведомлений, вы получите ответ UnauthorizedRegistration от FCM для ряда различных ошибок, связанных с ключами сервера приложений.
Ошибка UnauthorizedRegistration возникает в следующих случаях:
- Если вы не определили заголовок
Authorizationв запросе к FCM. - Ключ приложения, использованный для подписки пользователя, не совпадает с ключом, использованным для подписания заголовка авторизации.
- В JWT указан недопустимый срок действия, например он превышает 24 часа или уже истек.
- JWT имеет неправильный формат или содержит недопустимые значения.
Полный ответ об ошибке выглядит следующим образом:
<html>
<head>
<title>UnauthorizedRegistration</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<h1>UnauthorizedRegistration</h1>
<h2>Error 400</h2>
</body>
</html>
Если вы получили это сообщение об ошибке в Chrome, попробуйте выполнить тестирование в Firefox, чтобы получить больше информации о проблеме.
Firefox и Mozilla AutoPush
Firefox и Mozilla AutoPush предоставляют понятные сообщения об ошибках, связанных с Authorization.
Если в запросе на отправку push-уведомления не будет заголовка Authorization, Mozilla AutoPush вернет ошибку Unauthorized.
{
"errno": 109,
"message": "Request did not validate missing authorization header",
"code": 401,
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"error": "Unauthorized"
}
Если срок действия JWT истек, вы также получите ошибку Unauthorized с сообщением о том, что срок действия токена истек.
{
"code": 401,
"errno": 109,
"error": "Unauthorized",
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"message": "Request did not validate Invalid bearer token: Auth expired"
}
Если ключи сервера приложений, которые использовались при подписке пользователя и при подписании заголовка Authorization, не совпадают, возвращается ошибка Not Found:
{
"errno": 102,
"message": "Request did not validate invalid token",
"code": 404,
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"error": "Not Found"
}
Наконец, если в JWT указано недопустимое значение (например, в поле alg), вы получите от Mozilla AutoPush следующую ошибку:
{
"code": 401,
"errno": 109,
"error": "Unauthorized",
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"message": "Request did not validate Invalid Authorization Header"
}
Коды статуса HTTP
Существует ряд проблем, которые могут привести к тому, что служба push-уведомлений вернет код ответа, отличный от 201. Ниже приведен список кодов статуса HTTP и их значения в отношении веб-push-уведомлений.
| Код статуса | Описание |
|---|---|
| 429 | Слишком много запросов. Сервер приложений достиг ограничения частоты запросов к сервису push-уведомлений. Ответ сервиса должен содержать заголовок Retry-After, указывающий, через какое время можно отправить следующий запрос. |
| 400 | Недопустимый запрос. Один из заголовков недействителен или неправильно отформатирован. |
| 404 | Не найдено В этом случае вам следует удалить PushSubscription из серверной части и дождаться возможности повторно подписать пользователя. |
| 410 | Удалено. Подписка больше не действительна и должна быть удалена из серверной части. Это можно воспроизвести, вызвав `unsubscribe()` для `PushSubscription`. |
| 413 | Слишком большой размер полезной нагрузки. Минимальный размер полезной нагрузки, который должен поддерживаться сервисом push-уведомлений, составляет 4096 байт (или 4 КБ). Если размер больше, может возникнуть эта ошибка. |
Если кода статуса HTTP нет в этом списке, а сообщение об ошибке не помогает, проверьте, упоминается ли код статуса в спецификации протокола Web Push и описан ли там сценарий, в котором он может использоваться.
Проблема с шифрованием полезной нагрузки
Если вы можете успешно инициировать push-сообщение (т.е. отправить сообщение в службу веб-push и получить код ответа 201), но push-событие никогда не запускается в вашем сервис-воркере, это обычно указывает на то, что браузеру не удалось расшифровать полученное сообщение.
В этом случае в консоли DevTools браузера Firefox появится сообщение об ошибке:

Чтобы проверить, так ли это в Chrome, выполните следующие действия:
- Перейдите на страницу about://gcm-internals и нажмите кнопку Start Recording (Начать запись).

- Активируйте push-уведомление и посмотрите раздел Message Decryption Failure Log (Журнал ошибок расшифровки сообщений).

Если при расшифровке полезной нагрузки возникнет проблема, вы увидите сообщение об ошибке, похожее на приведенное выше. (Обратите внимание на сообщение AES-GCM decryption failed в столбце с подробными сведениями.)
Если проблема связана с шифрованием, то для ее устранения можно использовать следующие инструменты:
- Инструмент Push Encryption Verifier от Питера Беверлоо (Peter Beverloo).
- Web Push: Data Encryption Test Page by Mozilla
Проблема с подключением
Если вы не получаете событие push в сервис-воркере и не видите ошибок расшифровки, возможно, браузеру не удается подключиться к сервису push-уведомлений.
В Chrome вы можете проверить, получает ли браузер сообщения, изучив журнал Receive Message Log (Журнал полученных сообщений) в about://gcm-internals.

Если вы не получаете сообщения своевременно, убедитесь, что статус подключения вашего браузера – CONNECTED.

Если статус не CONNECTED, возможно, вам нужно удалить текущий профиль и создать новый. Если это не поможет, отправьте отчет об ошибке, как описано ниже.
Как отправлять отчеты об ошибках
Если ни один из приведенных выше советов не помог решить проблему и вы не можете определить ее причину, сообщите о ней разработчикам браузера, в котором она возникла:
Для Chrome: https://bugs.chromium.org/p/chromium/issues/list. Для Firefox: https://bugzilla.mozilla.org/.
Чтобы отчет об ошибке был полезным, он должен содержать следующие сведения:
- Браузеры, в которых вы тестировали сайт (например, Chrome версии 50, Chrome версии 51, Firefox версии 50, Firefox версии 51).
- Пример
PushSubscription, демонстрирующий проблему. - Приведите примеры запросов (например, содержимое сетевых запросов к сервису push-уведомлений, включая заголовки).
- Также добавьте примеры ответов на сетевые запросы.
Если вы можете предоставить воспроизводимый пример (исходный код или размещенный сайт), это часто ускоряет диагностику и решение проблемы.
Куда отправиться дальше
- Общие сведения о push-уведомлениях из веб-приложений
- Как работает push-уведомление
- Как подписать пользователя
- Permission UX
- Отправка сообщений с помощью библиотек Web Push
- Протокол Web Push
- Обработка событий push-уведомлений
- Показ уведомления
- Поведение уведомлений
- Распространенные шаблоны уведомлений
- Часто задаваемые вопросы о push-уведомлениях
- Распространенные проблемы и сообщения об ошибках