Когда вы сталкиваетесь с проблемой с помощью web push, может быть сложно отладить проблему или найти помощь. В этом документе описаны некоторые распространенные проблемы и действия, которые следует делать, если вы обнаружили ошибку в Chrome или Firefox.
Прежде чем мы углубимся в отладку, вы можете столкнуться с проблемами самих рабочих служб отладки, файл не обновляется, не удается зарегистрироваться или вообще просто необычное поведение. Существует замечательный документ по отладке сервис-воркеров , который я настоятельно рекомендую прочитать, если вы новичок в разработке сервис-воркеров.
При разработке и тестировании веб-пуша необходимо учитывать два отдельных этапа, каждый из которых имеет свой набор общих проблем:
- Отправка сообщения: убедитесь, что отправка сообщения прошла успешно. Вы должны получить HTTP-код 201. Если вы не:
- Проверьте наличие ошибок авторизации. Если вы получили сообщение об ошибке авторизации, см. раздел «Проблемы авторизации» .
- Другие ошибки API. Если вы получили ответ с кодом состояния, отличным от 201, см. раздел «Коды состояния HTTP» , чтобы узнать причину проблемы.
- Получение сообщения : если вы можете успешно отправить сообщение, но оно не получено в браузере:
- Проверьте наличие проблем с шифрованием: см. раздел «Проблемы с шифрованием полезной нагрузки» .
- Проверьте наличие проблем с подключением. Если проблема связана с Chrome, возможно, проблема связана с подключением. Дополнительную информацию см. в разделе «Проблемы с подключением» .
Если вы не можете отправлять и получать push-сообщения, а соответствующие разделы этого документа не помогают устранить проблему, возможно, вы обнаружили ошибку в самом механизме push-сообщений. В этом случае обратитесь к разделу «Сообщение об ошибках», чтобы подать хороший отчет об ошибках со всей необходимой информацией для ускорения процесса исправления ошибок.
Прежде чем мы начнем, я хотел бы отметить одну вещь : Firefox и служба Mozilla AutoPush выдают отличные сообщения об ошибках. Если вы застряли и не уверены, в чем проблема, проверьте Firefox и посмотрите, получите ли вы более полезное сообщение об ошибке.
Проблемы с авторизацией
Проблемы с авторизацией — одна из наиболее распространенных проблем, с которыми сталкиваются разработчики, когда начинают использовать веб-пуш. Обычно это проблема с настройкой ключей сервера приложений сайта (также известных как ключи VAPID) .
Самый простой способ поддержать push как в Firefox, так и в Chrome — это указать applicationServerKey
в вызове subscribe()
. Обратной стороной является то, что любое несоответствие между вашим интерфейсом и ключами сервера приведет к ошибке авторизации.
В Chrome и FCM
Для Chrome, который использует FCM в качестве службы push-уведомлений, вы получите ответ UnauthorizedRegistration
от FCM для ряда различных ошибок, все из которых связаны с ключами сервера приложений.
Вы получите сообщение об ошибке UnauthorizedRegistration
в любой из следующих ситуаций:
- Если вам не удалось определить заголовок
Authorization
в запросе к FCM. - Ключ вашего приложения, используемый для подписки пользователя, не соответствует ключу, используемому для подписи заголовка авторизации.
- Срок действия недействителен в вашем JWT, т. е. срок действия превышает 24 часа или срок действия JWT истек.
- 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
.
Вы также получите ответ о Unauthorized
ошибке от Mozilla AutoPush, если заголовок Authorization
не включен в ваш push-запрос.
{
"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"
}
Если ключи сервера приложений различаются между моментом подписки пользователя и подписанием заголовка авторизации, будет возвращена ошибка 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
Существует ряд проблем, которые могут привести к получению кода ответа, отличного от 201, от службы push-уведомлений. Ниже приведен список кодов состояния 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 и нажмите кнопку «Начать запись».
- Запустите push-сообщение и просмотрите «Журнал ошибок расшифровки сообщения».
Если возникнет проблема с расшифровкой полезных данных, вы увидите ошибку, аналогичную той, что показана выше. (Обратите внимание на сообщение AES-GCM decryption failed
в столбце сведений.)
Есть несколько инструментов, которые могут помочь в отладке шифрования, если это ваша проблема:
- Инструмент Push Encryption Verifier от Питера Беверлоо .
- Web Push: тестовая страница шифрования данных от Mozilla
Проблема с подключением
Если вы не получаете push-событие в своем сервис-воркере и не видите ошибок расшифровки, возможно, браузеру не удается подключиться к push-сервису.
В Chrome вы можете проверить, получает ли браузер сообщения, проверив «Журнал получения сообщений» (так в оригинале) в about://gcm-internals
.
Если вы не видите, что сообщение приходит своевременно, убедитесь, что статус соединения вашего браузера 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
- Подписка пользователя
- Разрешение UX
- Отправка сообщений с помощью библиотек Web Push
- Веб-пуш-протокол
- Обработка push-событий
- Отображение уведомления
- Поведение уведомлений
- Общие шаблоны уведомлений
- Часто задаваемые вопросы по push-уведомлениям
- Распространенные проблемы и сообщения об ошибках