GCM 错误代码

Posted

技术标签:

【中文标题】GCM 错误代码【英文标题】:GCM Error Codes 【发布时间】:2013-12-17 17:57:54 【问题描述】:

我有一个发送 GCM 推送通知的服务器应用程序。每次发送 1000 个收件人都会返回一条消息,告诉我每个注册 ID 的状态。有些会有错误代码。是否有来自 Google 的文档告诉我应该如何处理这些代码以及所有可能的错误代码是什么?我的 Google foo 没有显示任何内容。

【问题讨论】:

【参考方案1】:

你看起来不够努力。所有代码都在hereInterpreting an error response下解释。

我试图复制并粘贴它,以免它成为仅链接的答案,但格式有点不对:

解释错误响应

以下是处理不同类型错误的建议 尝试向设备发送消息时可能发生的情况:

缺少注册 ID 检查请求是否包含注册 ID(在纯文本消息中的 registration_id 参数中,或者在 JSON 中的registration_ids 字段)。 当错误代码为 MissingRegistration 时发生。

注册 ID 无效 检查您传递给服务器的注册 ID 的格式。确保它与手机收到的注册 ID 匹配 com.google.android.c2dm.intent.REGISTRATION 意图并且你是 不截断它或添加其他字符。 当错误代码为 InvalidRegistration 时发生。

发件人不匹配 注册 ID 与特定的发件人组相关联。当应用程序注册使用 GCM 时,它必须指定哪些发送者是 允许发送消息。确保您在使用时使用其中之一 试图向设备发送消息。如果你切换到不同的 发件人,现有的注册 ID 将不起作用。出错时发生 代码是 MismatchSenderId

未注册的设备 现有的注册 ID 可能在多种情况下不再有效,包括:

如果应用程序通过发出 com.google.android.c2dm.intent.UNREGISTER Intent 手动取消注册。 如果应用程序自动取消注册,如果用户卸载应用程序,可能会发生这种情况(但不能保证)。 如果注册 ID 过期。 Google 可能会决定刷新注册 ID。 如果应用程序已更新但新版本未配置广播接收器以接收 com.google.android.c2dm.intent.RECEIVE Intent。

对于所有这些情况,您应该从第 3 方服务器中删除此注册 ID,并停止使用它来发送消息。 当错误代码为 NotRegistered 时发生。

消息太大 消息中包含的有效负载数据的总大小不能超过 4096 字节。请注意,这包括 键和值。 当错误代码为 MessageTooBig 时发生。

数据密钥无效 有效负载数据包含一个键(例如 from 或任何以 google 为前缀的值),GCM 在 com.google.android.c2dm.intent.RECEIVE Intent,不能使用。笔记 GCM 也使用了一些词(例如 collapse_key),但是 有效载荷中允许,在这种情况下,有效载荷值将是 被 GCM 值覆盖。 当错误代码为 InvalidDataKey 时发生。

无效的生存时间 Time to Live 字段的值必须是一个整数,表示 0 到 2,419,200(4 周)之间的持续时间(以秒为单位)。 当错误代码为 InvalidTtl 时发生。

身份验证错误 您尝试用于发送邮件的发件人帐户无法通过身份验证。可能的原因有:

授权标头丢失或语法无效。 作为密钥发送的项目编号无效。 密钥有效,但 GCM 服务已禁用。 请求来自未在服务器密钥 IP 中列入白名单的服务器。

检查您在 Authorization 标头中发送的令牌是否是与您的项目关联的正确 API 密钥。你可以 通过运行以下命令检查 API 密钥的有效性:

api_key=YOUR_API_KEY

curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "\"registration_ids\":[\"ABC\"]"

如果您收到 401 HTTP 状态代码,则您的 API 密钥无效。否则,您应该会看到如下内容:

"multicast_id":6782339717028231855,"success":0,"failure":1,"canonical_ids":0,"results":["error":"InvalidRegistration"]

如果您想确认注册 ID 的有效性,可以将“ABC”替换为注册 ID。 当 HTTP 状态码为 401 时发生。

超时 服务器无法及时处理请求。您应该重试相同的请求,但您必须遵守以下要求:

如果 Retry-After 标头包含在 GCM 服务器的响应中,请遵守该标头。 在重试机制中实施指数退避。这意味着每次重试失败后延迟呈指数增长(例如 如果您在第一次重试前等待了一秒钟,请至少等待两次 下一秒之前,然后是 4 秒,依此类推)。如果你是 发送多条消息,将每条消息单独延迟一个 额外的随机数量,以避免向所有人发出新请求 同时发消息。 引起问题的发件人有被列入黑名单的风险。 当 HTTP 状态码介于 501 和 599 之间,或者结果数组中 JSON 对象的错误字段为 不可用。

内部服务器错误 服务器在尝试处理请求时遇到错误。您可以重试相同的请求(遵守要求 在超时部分中列出),但如果错误仍然存​​在,请 在 android-gcm 组中报告问题。 当 HTTP 状态码为 500 或结果数组中 JSON 对象的错误字段为 InternalServerError 时发生。

无效的包名称 一条消息被发送到一个注册 ID,其包名称与请求中传递的值不匹配。当错误代码为 InvalidPackageName 时发生。

编辑(06/06/2015):

一个新的错误响应代码表已经发布here。

新的错误响应:

超出设备消息速率 发送到特定设备的消息速率太高。减少发送到此设备的消息数量,不要立即重试发送到此设备。

Topics Message Rate Exceeded 发送给特定主题订阅者的消息率太高。减少为此主题发送的消息数量,不要立即重试发送。

编辑(2019 年 7 月 21 日):

一个新的错误响应代码表已经发布here。

【讨论】:

谢谢,伊兰!我很惭愧地说,我看了好几遍页面的那个部分。我认为它的格式让我失望。 @Eran 答案中的链接不再有内容:developer.android.com/google/gcm/http.html#error_codes 上周我能够看到这些内容。我不确定周末发生了什么。 @TamilVendhanKanagaraju 好吧,在这种情况下,内容在这里是一件好事。 @Eran:是的,没错。感谢您在这里捕捉它。 :-) @TamilVendhanKanagaraju 现在有一个包含错误代码的新链接。我将其添加到答案中。

以上是关于GCM 错误代码的主要内容,如果未能解决你的问题,请参考以下文章

服务器端 GCM 返回错误 400

GCM'错误:未注册'

浏览器中的“代码:Messaging / Incorrect-GCM-sender-id”错误消息

GCM 注册失败,出现 1003 错误

Android GCM“错误”:“未注册”

Laravel 5.1 GCM 推送通知 SSL 错误