2012-01-26 90 views
3

我遇到了C2DM问题。有时候完美的作品,有时我的信息不会被推送。 有没有可靠的方法来执行此连接?拉取消息。我读过的地方是,谷歌所做的就是始终保持低带宽的TCP连接到他们的服务器。所以我认为 在网络类型之间切换时TCP连接下降,Android尝试重新建立与C2DM服务器的连接。所以这可能会导致WiFi网络受限。 这是错误的假设吗?C2DM的可靠性

我与WhatsApp的注意到,在WiFi有时我没有得到消息。当我切换到3G时,我通常会在切换时获取它们。 您提供的C2DM体验有哪些技巧?

回答

3

C2DM不适合您的应用程序的关键部分,因为谷歌目前不提供SLA或付费层,以保证您可靠的服务和吞吐量。

我已考虑过几种选择自己:XMPP via asmackParseDeaconUrban Airship,并MQTT

经过一番阅读和试验后,我决定选择MQTT。这是一个在IBM发明的非常轻量级的遥测协议,非常适合Android推送通知场景。我建议你试试看,这里有一篇很好的博客文章来指导你:Using MQTT in Android mobile applications

希望这会有所帮助。

2

C2DM并不保证您的信息将被发送,你的应用程序不应该假定,才能正常工作。因此,您的C2DM消息不应该包含数据本身,而是通知存在可用数据。换句话说,C2DM消息的丢失不应该导致您的应用程序丢失数据;它应该最多导致它花费更长的时间才能注意到服务器上有某个数据可用。

一个典型的应用程序应该在一段时间(半晌)连接到其服务器使用一次C2DM即使,在涵盖C2DM消息可能无法传递的情况下检索邮件。

根据网络配置,设备可能无法接收C2DM消息;限制性防火墙或其他奇怪的WiFi配置可能会这样做。

+0

我只是使用C2DM来唤醒我的服务,否则它没有任何信息,但是......为了以防万一,实时唤醒服务并不是个坏主意?这是你的建议吗? –

+0

我真正感兴趣的是......有办法说......“你好C2DM,你在吗?” –

0

你可以做到这一点的最好方法是通过测试。我在我的应用程序中有一个机制,当我启用调试时,我收到来自客户端的HTTP请求,说他们收到了该消息。

我发现这个数字大概是80%。幸运的是,这足以满足我的应用程序的范围。

Wifi不应干扰接收消息的C2DM能力。至少在手机处于活动状态时。

发生什么事情是,在手机处于待机状态一段时间后,android会关闭wifi。该消息在该时间段不可用,只是因为没有可用的互联网连接。在用户将电话唤醒后,他们应该收到消息。

+0

谢谢你的回答。 –

1
  • 随着C2DM可靠性不能保证。所以最好有一个ACK 消息或某种方式让您(发件人)认识到该消息已成功接收。
  • 也使它正确覆盖onRegister类的一点,因为设备注册ID保持洗牌。最后,如果你打算定期发送更新,我宁愿投票到C2DM,因为只有大量的要求才能使其运行,而可靠性和最终控制仍然不能保证。
1

我一直在努力解决同样的问题。你描述的行为是准确的。我正在开发一个应用程序,主要使用Wifi连接使用c2dm,并且我必须实施一个AsyncTask来周期性地(分钟和半天)拨打WifiManager.reassociate()(关闭并再次打开无线网络触发所有未决通知的到达,这就是启发这个解决方案的原因),所以我可以保持通知到达尽可能准确。不过,不太确定这种做法的正确性。

+0

你可能会用这种技术杀死其他应用程序的连接。 例如,您取消Google Play中浏览器或应用更新的下载。 –

0

经过很长一段时间的研究,几乎所有的互联网为答案,我找到了它。正如我之前发布的那样,我自己一直在努力解决这个问题,并发现这不是一个C2DM问题,甚至是一个实施问题。这只是一个路由器或防火墙的错误配置。 Android使用具有心跳保持机制的持久性TCP连接来确保连接保持连接。 Google使用连接状态来确定您的设备是否处于闲置状态。但是,如果您的路由器具有检查“未使用”连接并终止它们的保护策略,那么这将不起作用。应该立即传递(接近)Android通知。我已经在我的学校网络和家庭网络中测试过这两种不同的行为。

要恢复:请务必检查您的网络配置。

0

有些APN比其他C2DM工作得更好。例如,Google“gtalk apn”可以找到关于APN对C2DM影响的论坛。

1

您是否每15分钟连接测试一次?我创建了一个计划任务来发送消息。我使用NotifyMyAndroid来推动它。有时候C2DM不能立即推送信息约10分钟。但是,有时你会在一秒钟左右得到它。