GCM错误代码

Ian*_*Lee 12 android push-notification google-cloud-messaging

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

Era*_*ran 36

你看起来不够努力.所有的代码解释这里Interpreting an error response.

我试图复制并粘贴它,以便它不是一个仅链接的答案,但格式有点偏:

解释错误响应

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

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

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

不匹配的发件人 注册ID与某组发件人绑定.当应用程序注册GCM使用时,它必须指定允许哪些发件人发送消息.在尝试向设备发送消息时,请确保使用其中一个.如果您切换到其他发件人,现有的注册ID将无效.错误代码为MismatchSenderId时发生.

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

  • 如果应用程序通过发出com.google.android.c2dm.intent.UNREGISTER意图手动取消注册.
  • 如果应用程序自动取消注册,则可能会发生(但不保证)用户卸载应用程序.
  • 如果注册ID到期.Google可能决定刷新注册ID.
  • 如果应用程序已更新,但新版本没有配置为接收com.google.android.c2dm.intent.RECEIVE意图的广播接收器.

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

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

无效的数据密钥 有效负载数据包含GCM在com.google.android.c2dm.intent.RECEIVE Intent内部使用的密钥(例如来自google的前缀或任何值),并且无法使用.请注意,GCM也使用某些单词(例如collapse_key),但在有效负载中允许使用,在这种情况下,有效负载值将被GCM值覆盖.错误代码为InvalidDataKey时发生.

无效生存时间生存 时间字段的值必须是一个整数,表示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, "成功":0, "失败":1, "canonical_ids":0 "结果":[{ "错误": "InvalidRegistration"}]}

如果要确认注册ID的有效性,可以通过将"ABC"替换为注册ID来实现.HTTP状态代码为401时发生.

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

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

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

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

编辑(06/06/2015):

此处发布新的错误响应代码表.

新的错误响应:

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

主题消息速率超过特定主题的订阅者消息速率过高.减少为此主题发送的消息数,不要立即重试发送.

  • 答案中的@Eran链接不再具有内容:http://developer.android.com/google/gcm/http.html#error_codes上周我能够看到这些内容.我不确定周末发生了什么. (2认同)