谷歌云消息不返回规范 ID

Posted

技术标签:

【中文标题】谷歌云消息不返回规范 ID【英文标题】:Google Cloud Messaging dont return Canonical ID 【发布时间】:2012-10-07 23:11:29 【问题描述】:

我故意向 GCM 注册了几次我的应用程序以测试规范 id 概念,但云没有将其返回给我。请参阅下面的服务器日志,它是同一台设备,我可以在 android 日志中看到它收到了四次消息。但是我从来没有从谷歌那里得到一个规范的 id,我误解了什么?

[INFO  com.bipper.filters.PushUpdatesFilter] method: POST  childId: 13  has pending updates: true  url: /mybipperapi/do/parents/1/children/13/usagelimits

[INFO  com.bipper.services.gcm.GcmSenderService] registrationId: APA91bHQIWguRXvpVrg7Xh1nOsUqqbephClS9KkuuFf0eg3fkfgjkmvi1o-0WaSwWWdWwqXw9e3X80OsZwdINr1ufBjEXQJ5om48lL6q8bH3Vrlaf5U11FbyzQdVvzGy-3QBqahc_nMh9FeiL2sBzU0KPGG3y9xtYg

[INFO  com.bipper.services.gcm.GcmSenderService] Sent message to one device: [ messageId=0:1349650679774901%d3cfcce76e2555b5 ]


[INFO  com.bipper.services.gcm.GcmSenderService] registrationId: APA91bE9Vl_qijVdpFTqlJXA2OHyaF2cjKaCi8ZvNrD5r2woNs_TSuJgVuxn7RIF3pef6vdtd2MMV1TrWnusbGPXy4uWT4KJBhuAoAYgCjbXJduv-oz13_xICIKYOZTAFH2OpuC8E1Hw65KN6N4QukxG0W4Zor8jSg

[INFO  com.bipper.services.gcm.GcmSenderService] Sent message to one device: [ messageId=0:1349650679857971%d3cfcce76e2555b5 ]


[INFO  com.bipper.services.gcm.GcmSenderService] registrationId: APA91bEzQag9HBPbrR0wtaSuR3HA5NV795ZuDzxwQJVnQfc2r1lDv0gUXxc6GikUJDWMiUSge-b0BS1Tz2yIr8flpBqmAdpgQnatvP19PVm9zd8PopE51T-NJkfqqX65oPfKkx93Os7qS8_-IokjbyNIOK5FDCsrAQ

[INFO  com.bipper.services.gcm.GcmSenderService] Sent message to one device: [ messageId=0:1349650679940798%d3cfcce76e2555b5 ]


[INFO  com.bipper.services.gcm.GcmSenderService] registrationId: APA91bG_nVU-8VM9JSbTlxjAuseJ4LZG75BOoP5kd85garpcW698w4uwGWCy3dkUt3pXiXWhAV-KLPuEr-vw4_yARwjma2U46KXjmEoBwkTaVNi9t5M4sKRtqaKGZTcsaoa_Ng4EenVw41QFTi2At75946WR3Qu7jQ

[INFO  com.bipper.services.gcm.GcmSenderService] Sent message to one device: [ messageId=0:1349650680044947%d3cfcce76e2555b5 ]

[WARN  com.bipper.filters.PushUpdatesFilter] results has size 4, this is fishy

[INFO  com.bipper.filters.PushUpdatesFilter] [ messageId=0:1349650679774901%d3cfcce76e2555b5 ]
[INFO  com.bipper.filters.PushUpdatesFilter] [ messageId=0:1349650679857971%d3cfcce76e2555b5 ]
[INFO  com.bipper.filters.PushUpdatesFilter] [ messageId=0:1349650679940798%d3cfcce76e2555b5 ]
[INFO  com.bipper.filters.PushUpdatesFilter] [ messageId=0:1349650680044947%d3cfcce76e2555b5 ]

文档(link) 说:

规范 ID

在服务器端,只要应用程序运行良好, 一切都应该正常工作。但是,如果应用程序中的错误 触发同一设备的多个注册,可能很难 协调状态,您最终可能会收到重复的消息。

GCM 提供了一种称为“规范注册 ID”的工具,可以轻松地 从这些情况中恢复过来。定义了一个规范的注册 ID 作为您的应用程序请求的最后一次注册的 ID。 这是服务器在向服务器发送消息时应使用的 ID 设备。

如果您稍后尝试使用其他注册方式发送消息 ID,GCM 会照常处理请求,但会包含 的registration_id字段中的规范注册ID 回复。确保替换存储在您的注册 ID 具有此规范 ID 的服务器,因为最终您使用的 ID 将 停止工作。

【问题讨论】:

你能访问和发布响应 JSON 对象吗? 【参考方案1】:

当您从 GCM 解析结果时,您必须手动检查它是否返回一个 canonicalId。

String canonicalRegId = result.getCanonicalRegistrationId();

然后,您必须确保使用此新 ID 推送到设备。

【讨论】:

Jepp,我知道,但是 GCM 在 Result 对象中没有向我返回任何规范的注册 ID【参考方案2】:

根据Google docs,

当纯文本请求成功(HTTP 状态码 200)时, 响应正文以键/值对的形式包含 1 或 2 行。 第一行始终可用,其内容是 id=ID 的 已发送消息或 Error=GCM 错误代码。第二行,如果有的话, 格式为registration_id=canonical ID。 第二行(包含规范 id)是 可选,只有在第一行没有错误的情况下才能发送。

如果存在规范 id,则 pgratton 是正确的,您必须解析结果并使用 result.getCanonicalRegistrationId();

获取它

即使在推送后收到成功响应后,规范 id 也可以为空。在大多数情况下,它将为 null,这意味着您推送的令牌是可以的,无需替换它。当令牌发生变化时(例如,在谷歌刷新令牌的情况下)并且如果我们仍然使用旧令牌推送,我猜您会在您的响应中收到规范 id,您必须用它替换旧令牌.

如果您的推送也返回失败响应,则响应中不会出现规范 ID。

【讨论】:

以上是关于谷歌云消息不返回规范 ID的主要内容,如果未能解决你的问题,请参考以下文章

新的谷歌云消息 API

谷歌云消息唯一键

谷歌云消息错误服务不可用[重复]

谷歌云平台推送订阅发送重复消息 ID 字段

谷歌云消息安全

谷歌云消息逻辑解决方案