当您遇到 Web 推送问题时,可能很难调试问题或 寻求帮助。本文档概述了一些常见问题,以及您应该采取的 如果您在 Chrome 或 Firefox 中发现了错误,可以采取以下措施。
在我们深入了解如何调试推送之前,您可能会遇到调试方面的问题 Service Worker 本身,则文件未更新、无法注册或 通常只是异常行为。这里有 关于调试 Service Worker 的精彩文档 我强烈建议您参阅 Service Worker 开发。
在开发和测试 Web 推送时,需要对两个不同的阶段进行核对, 每种方法都有自己的一系列常见问题:
- 发送消息:确保消息发送成功。
您应该会收到 201 HTTP 代码。如果您不是:
<ph type="x-smartling-placeholder">
- </ph>
- 检查授权错误:如果您收到了授权 请查看 “授权问题”部分。
- 其他 API 错误:如果您收到非 201 状态代码响应, 请参阅HTTP 状态代码部分 有关问题原因的指导说明。
- 接收消息:如果您能够成功发送消息, 但浏览器未收到消息: <ph type="x-smartling-placeholder">
如果您无法收发推送消息和相关部分 对问题的调试没有帮助,那么您可能会发现 推送机制本身存在的 bug在这种情况下,请参阅 提高 bug 报告 部分,提交一份完善的错误报告,其中包含所有必要的信息,以便我们加快处理速度 问题修复流程
在开始之前,我要说的一点是,Firefox 和 Mozilla AutoPush Service 会显示大量错误消息。如果您遇到困难 不确定问题出在哪里,请在 Firefox 中进行测试,看看能否 您可以获得更实用的错误消息
授权问题
授权问题是开发者遇到的最常见问题之一 我们先来了解 Web 推送这通常是 网站的应用服务器密钥(也称为 VAPID 密钥) 。
要在 Firefox 和 Chrome 中支持推送,最简单的方法就是提供
subscribe()
调用中的 applicationServerKey
。但缺点是
前端和服务器密钥之间的任何差异都会导致
授权错误。
在 Chrome 和 FCM 上
对于使用 FCM 作为推送服务的 Chrome,您会收到一条
FCM 针对一系列不同的 UnauthorizedRegistration
响应
所有错误都涉及应用服务器密钥。
出现以下任一情况时,您会收到 UnauthorizedRegistration
错误
情况:
- 如果您未能在对 FCM 的请求中定义
Authorization
标头。 - 用于订阅用户的应用密钥与使用的密钥不匹配 对 Authorization 标头进行签名。
- 该过期时间在您的 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
标头)
请求。
{
"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 的以下错误信息 自动推送:
{
"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 状态代码
有多种问题会导致 推送服务下面列出了一些 HTTP 状态代码及其相关含义 Web 推送。
状态代码 | 说明 |
---|---|
429 | 请求数量过多。您的应用服务器已达到速率限制, 推送服务服务的响应应包含“重试-之后”标头设为 指明在多长时间后可以发出其他请求 |
400 | 请求无效。您的某个标头无效或 格式不当。 |
404 | 未找到。在这种情况下,您应该将 PushSubscription 从 并等待用户重新订阅的机会。 |
410 | 走了。订阅已失效,应从您的 。可以通过在 `PushSubscription`. |
413 | 有效负载过大。推送服务必须达到的最小载荷大小 支持 4096 个字节(或 4kb)。任何更大的文件都可能会导致此错误。 |
如果 HTTP 状态代码不在此列表中,且错误消息 请参阅网络推送协议 规范来确认 引用了状态代码,并说明了该状态代码何时可以 。
载荷加密问题
如果您可以成功触发推送消息(例如,将消息发送到 Web、 推送服务并接收 201 响应代码),但推送事件永远不会 这通常表示浏览器无法 解密收到的消息。
如果是这种情况,您会在 Firefox 的开发者工具中看到一条错误消息。 控制台如下所示:
要检查是否是 Chrome 中的问题,请执行以下操作:
- 前往 about://gcm-internals,然后点击“Start Recording”(开始录制)按钮。
- 触发推送消息,并查看“消息解密失败日志”。
如果载荷解密出现问题,系统会显示错误消息
与上面显示的示例类似(请注意 AES-GCM decryption failed
消息)。
如果遇到此问题,以下一些工具可能有助于调试加密问题:
连接问题
如果您没有在 Service Worker 中收到推送事件,也没有 则浏览器可能无法连接到 推送服务
在 Chrome 浏览器中,您可以通过检查浏览器是否正在接收消息,
“接收消息日志”(sic)about://gcm-internals
。
如果您看到的邮件没有及时送达,请确保
您的浏览器的连接状态为 CONNECTED
:
如果不是“已连接”,您可能需要删除当前的个人资料,并且 创建一个新网域。如果 仍然无法解决问题,请按照下面的建议提交错误报告。
提交 bug 报告
如果上述方法均无法解决您的问题,并且没有迹象表明 请向我们报告您使用的浏览器的问题 问题:
对于 Chrome,您应在此处提交问题: https://bugs.chromium.org/p/chromium/issues/list 对于 Firefox,您应在以下位置提出此问题: https://bugzilla.mozilla.org/
如需提供优质的 bug 报告,您应提供以下详细信息:
- 进行过测试的浏览器(例如 Chrome 50、Chrome 51、Firefox) 版本 50、Firefox 51)。
- 演示问题的
PushSubscription
示例。 - 包含任何示例请求(即发送到推送的网络请求内容) 包括标头)。
- 同时包括网络请求的所有示例响应。
如果您可以提供可重现的示例(源代码或托管网络示例) 通常可以加快诊断和解决问题的速度。