单个设备突然停止从我的服务器接收 C2DM 推送

Posted

技术标签:

【中文标题】单个设备突然停止从我的服务器接收 C2DM 推送【英文标题】:Single device suddenly stopped getting C2DM pushes from my server 【发布时间】:2012-04-18 09:26:45 【问题描述】:

我们有一个工作应用和服务器,它使用 C2DM 将消息推送到 android 设备。

两天前,我们的一台测试设备停止接收来自服务器的推送。

服务器发送到的 deviceRegistrationId 似乎已更新且正确,设备具有网络连接,并且使用 Gtalk 等 C2DM 的谷歌应用程序在其上正常工作。

服务器从 Google 的 C2DM 服务器获得成功响应,正确响应为“id=0:133467...61+ac67f...66

在此之前设备已正确接受推送。

我们的应用已投放市场,每天都有很多用户使用,我们还没有收到任何类似的用户投诉(这并不意味着我们的某些用户不会遇到这种情况)

有什么想法可以进一步检查以了解这一点吗?

有没有办法使用从 C2DM 服务器收到的 id 来检查特定消息发生了什么?

谢谢。

【问题讨论】:

【参考方案1】:

我不知道有任何报告可以跟踪消息。

我要检查的第一件事是,您要向其发送消息的注册 ID 仍然是设备正在使用的注册 ID - 如果它们不匹配,可能会导致您看到的内容。

我看到一些设备突然停止接收 C2DM 消息。在我们的例子中,重启设备通常会修复它。

我看到的另一种情况是特定网络上的设备不接收消息(特别是某些 wifi 网络)。

【讨论】:

感谢 Ollie,我检查了保存在我们应用程序首选项中的 deviceRegistrationId,它与服务器发送到的相同。重启设备也没有用。设备使用的网络没有变化,我们已经在几个不同的 WiFi 网络上进行了尝试(设备没有 3G 计划) 为了排除它,我会尝试将该设备接入 3G 网络。我们到了一个地步,我们总是在 wifi 和 3G 上进行测试,而一些 beta 测试人员 wifi 网络 C2DM 消息从未到达 - 这提醒了应用程序有一个 C2DM 失败的备份策略是多么重要(例如慢轮询)跨度> 我会尝试的其他方法是在设备上请求另一个注册 ID。它可能无济于事,但它排除了这个问题。 我故意不想重新注册设备,直到我们弄清楚这一点,因为用户将无法做到这一点。 +1 关于 3G 建议,我们会尝试,但我们没有 3g 计划的用户可能会遇到这些问题,这听起来不太好 3g 没有解决这个问题......我们可以尝试解决这个问题的任何其他想法吗?我开始考虑让每台设备都向服务器请求 ping,如果一个小时内没有到达,请重新注册...我真的很想避免在我的服务器和用户的设备上出现这种过载.【参考方案2】:

身份验证密钥会在 C2DM 服务器上频繁更改每次都获取密钥?

【讨论】:

感谢 Bhaskar,但我们的服务器能够处理密钥更改,服务器部分工作正常,它能够将消息推送到我们的设备。问题在于设备上的 deviceRegistrationId 以某种方式未刷新。我们的客户端也能够接受来自 C2DM 的新 onRegistered 调用以刷新到 deviceRegistrationId,但我们在此设备上没有收到任何消息。 auth key 不会经常变化。它实际上很少更改,尽管许多目前正在到期。【参考方案3】:

Google 正在更改其客户端登录过期政策。 他们正在新标头中发送数据以更新我想要的注册,您需要更改代码才能使其正常工作。

详情如下:http://android-developers.blogspot.com/2012/04/android-c2dm-client-login-key.html?m=1

【讨论】:

感谢机器,客户端登录过期仅在服务器端,我们的服务器在获取 Update-Client-Auth 标头时正确更新客户端登录。我们的问题出在客户端,可能是 deviceRegistrationID。

以上是关于单个设备突然停止从我的服务器接收 C2DM 推送的主要内容,如果未能解决你的问题,请参考以下文章

android推送通知c2dm

谷歌啥时候停止支持 c2dm 推送通知?

Android 4.0 c2dm 问题

快速获取设备令牌[重复]

如何将 C2DM 消息显示为推送通知(在 GCMIntentService 类的 onMessage() 函数中接收)

c2dm android推送通知每天广播量