我有一个发送GCM推送通知的服务器应用程序。每发送1000个收件人都会返回一条消息,告诉我每个注册ID的状态。有些人会有错误代码。是否有一个来自Google的文档告诉我我应该如何处理这些代码以及所有可能的错误代码是什么?我的Google foo没有发现任何事情。
答案 0 :(得分:36)
你看起来不够努力。 Interpreting an error response
下的here解释了所有代码。
我尝试复制并粘贴它,以便它不是仅链接答案,但格式有点偏离:
解释错误回复
以下是处理不同类型错误的建议 尝试向设备发送消息时可能会发生这种情况:
缺少注册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意图手动取消注册。
- 如果应用程序自动取消注册,如果用户卸载该应用程序,则可能会发生(但不能保证)。
- 如果注册ID到期。 Google可能会决定刷新注册ID。
- 如果应用程序已更新,但新版本没有配置接收com.google.android.c2dm.intent.RECEIVE意图的广播接收器。
对于所有这些情况,您应该从第三方服务器中删除此注册ID,并停止使用它来发送消息。 错误代码为未注册时发生。
消息太大 消息中包含的有效载荷数据的总大小不能超过4096字节。请注意,这包括两者的大小 键和值。 错误代码为 MessageTooBig 时发生。
无效的数据密钥 有效负载数据包含GCM内部使用的密钥(例如来自谷歌的前缀或任何值)。 com.google.android.c2dm.intent.RECEIVE意图并且无法使用。注意 一些单词(例如collapse_key)也被GCM使用但是 允许在有效载荷中,在这种情况下有效载荷值将是 被GCM值覆盖。 错误代码为 InvalidDataKey 时发生。
无效的生存时间 生存时间字段的值必须是一个整数,表示0到2,419,200(4周)之间的持续时间(以秒为单位)。 错误代码为 InvalidTtl 时发生。
身份验证错误 您尝试用来发送邮件的发件人帐户无法通过身份验证。可能的原因是:
- 缺少授权标头或语法无效。
- 作为密钥发送的项目编号无效。
- 密钥有效但GCM服务已停用。
- 请求来自服务器密钥IP中未列入白名单的服务器。
检查您在Authorization标头内发送的令牌是否是与您的项目关联的正确API密钥。您可以 运行以下命令检查API密钥的有效性:
API_KEY = YOUR_API_KEY
curl --header"授权: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,&# 34;结果":[{"错误":" 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):
已发布新的错误回复代码表here。
新的错误回复:
超出设备消息速率特定设备的消息速率过高。减少发送到此设备的消息数量,不要立即重试发送到此设备。
主题消息率超过特定主题订阅者的消息率过高。减少为此主题发送的消息数,不要立即重试发送。