我遇到了C2DM问题。有时候工作得很完美,有时我的信息根本就没有被推动。 是否有可靠的方法来强制执行此连接?提取消息。我在某处读到谷歌所做的是始终保持与其服务器的低带宽TCP连接。所以我认为 当在网络类型之间切换时,TCP连接中断,Android尝试重新建立与C2DM服务器的连接。因此,在受限网络的WiFi上可能会失败。 这是错误的假设吗?
我注意到WhatsApp在WiFi上有时我不会收到消息。当我切换到3G时,我通常会在切换时获得它们。 您提供哪些C2DM体验提示?
答案 0 :(得分:3)
C2DM不适合您应用的关键部分,因为Google目前不提供SLA或付费等级,以保证您可靠的服务和吞吐量。
我自己考虑了几种选择:XMPP via asmack,Parse,Deacon,Urban Airship和MQTT。
经过一些阅读和实验后,我决定选择MQTT。它是IBM发明的一种非常轻量级的遥测协议,非常适合Android推送通知场景。我建议你试一试,这是一篇很好的博客文章来指导你:Using MQTT in Android mobile applications。
希望这有帮助。
答案 1 :(得分:2)
C2DM不保证您的邮件将被传递,并且您的应用程序不应该假设为了正常工作。因此,您的C2DM消息绝不应包含数据本身,而应包含可用数据的通知。换句话说,丢失C2DM消息不应该导致您的应用程序丢失数据;它最多会导致需要更长时间才能注意到您的服务器上有某些数据可用。
典型的应用程序应该偶尔(很长一段时间)连接到其服务器以检索消息,即使在使用C2DM时,也可以覆盖可能无法传递C2DM消息的情况。
根据网络配置,设备可能无法接收C2DM消息;限制性防火墙或其他奇怪的WiFi配置可能会这样做。
答案 2 :(得分:1)
答案 3 :(得分:1)
我自己一直在努力解决同样的问题。您描述的行为是准确的。我正在开发一个主要使用带有Wifi连接的c2dm的应用程序,我必须实现一个AsyncTask定期(一分半钟)调用WifiManager.reassociate()(关闭再打开wifi会触发所有待处理通知的到来,这就是启发这个解决方案的原因)所以我可以尽可能准确地保持通知到达。但不太确定这种做法的正确性。
答案 4 :(得分:1)
您是否每15分钟连接测试一次?我创建了一个计划任务来发送消息。我使用NotifyMyAndroid来推动它。 C2DM有时会在瞬间推送消息大约10分钟。但是,有时你会在一秒左右得到它。
答案 5 :(得分:0)
你可以做到这一点的最佳方法是通过测试。我的应用程序中有一个机制,当我启用调试时,我收到来自客户端的HTTP请求,说他们收到了消息。
我发现这个数字大约是80%。幸运的是,这足以满足我的应用范围。
Wifi不应干扰C2DM接收消息的能力。至少在手机处于活动状态时。
当手机处于待机状态一段时间后,Android会关闭wifi。这段消息在那段时间内不可用,仅仅是因为没有可用的互联网连接。在用户唤醒手机后,他们应该收到消息。
答案 6 :(得分:0)
经过长时间的研究,几乎所有的“互联网”都得到了答案,我找到了它。正如我之前发布的那样,我自己也在努力解决这个问题,并发现它不是C2DM问题,甚至是实现问题。这只是一个路由器或防火墙配置错误。 Android使用具有心跳保持活动机制的持久TCP连接来确保连接保持正常。 Google使用连接状态来确定您的设备是否处于空闲状态。但是,如果您的路由器具有检查“未使用”连接并终止它们的保护策略,那么这将无效。 Android通知应立即发送(接近)。我在我的学校网络和家庭网络中测试了这个,有两种不同的行为。
要恢复:请务必检查您的网络配置。
答案 7 :(得分:0)
有些APN比使用C2DM的其他APN工作得更好。例如,Google“gtalk apn”可以找到有关APN对C2DM影响的论坛。