我已经构建了一个功能正常的C2DM应用程序,通常效果很好,推送消息快速到达。但是,当我第一次启动应用程序或重新启动应用程序时,我会发现相当频繁,消息不会到达。
它们肯定是成功发送的(我得到200响应)并且消息格式肯定是正确的(稍后发送相同的消息可以正常工作)。失败可以持续很短的几分钟,然后突然又开始工作,并且此后一直工作。
然而,即使它开始工作,旧的消息显然已经消失,永远不会到来。这些消息肯定没有到达 - 我有大量的日志记录,突出显示任何到达的C2DM消息。
我完全清楚C2DM永远不会保证交付,所以我希望有些消息会失败,但根据我的经验,在某些情况下,它只是不起作用。我显然想知道我的应用程序或C2DM服务本身是否存在错误。
什么可能导致C2DM无法传递消息? 如果无法传递消息,为什么C2DM服务器不会再次从其队列中尝试? 相关 - 我应该仅在应用程序第一次启动时获取新的注册ID,还是每次应用程序启动时刷新它?我目前做的是后者(在应用程序中,而不是活动)。
答案 0 :(得分:10)
我意识到我犯了一个小学生的错误。每次应用程序启动时,我都会重新注册C2DM。该过程有时需要几秒钟,在此期间,应用程序将不会收到发送到旧注册ID的推送消息。这解释了为什么在启动应用程序后,特别可能无法立即收到推送消息。
解决方案是确保仅在应用程序尚未拥有注册ID时才请求注册ID。推送消息现在可以更加可靠地工作。
答案 1 :(得分:1)
这很可能是正确的行为。邮件不保证根本无法传递。更别说了。
最有可能的是,您的手机和Google服务器之间的连接正在被取消,需要一段时间才能恢复。