猜测C2DM是否已连接的方法

Ian*_*ott 16 android google-talk android-c2dm

我正在尝试对是否可以接收C2DM消息进行最佳猜测估计.

我创建了一个应用程序,它依赖于在手机无法访问时将信息推送到手机.我知道C2DM不能保证交付,但我至少想知道什么时候可以传递消息; 当它不是我们回到我们自己的推送服务(并且实际上可以告诉我们什么时候连接).

我注意到即使没有登录谷歌帐户,Android上的C2DM仍会发出身份验证令牌; 消息似乎仍然在这个实例中传递,即使它声明它们不应该.如果未连接GTalk(防火墙或其他原因),则在请求身份验证令牌时根本不会返回任何响应.当手机处于飞行模式时,Auth令牌将返回到应用程序.这意味着它并不像检查互联网是否可用那么简单.我找不到一种可靠的方法来检查GTalk是否已登录.

同样,我不需要保证邮件的传递,但我至少想知道交付是否可行.有人有有趣的解决方案吗?

Fel*_*lix 11

观看此视频,这是关于C2DM的Google I/O讨论,如何使用它以及它是如何工作的.AFAIK,你不知道它是否连接.可能大多数时候他们甚至不知道(直到他们必须传递信息并失败).

但是,强烈建议(在视频中)您不通过C2DM发送重要数据(因为消息可能会丢失).该服务应仅用作"网络痒"(占地面积尽可能小).您的应用程序应该被这个问题唤醒,它应该开始获取它自己需要的信息.

现在,如果以这种方式实现它,应该很容易实现轮询机制.由于您已经将"痒"与实际信息检索分开,因此如果没有痒,您可以偶尔触发检索.

你可以做些什么来检查C2DM是否连接就像ping一样:

  1. 通过C2DM发送消息给手机
  2. 应用程序接收(或不接收)消息并将"pong"发送回您的服务器
  3. 在将设备标记为"离线"之前,服务器等待"乒乓"一段预定的时间(1-2分钟,我说).

编辑:依靠GTalk是不可行的.GTalk就像你的应用程序一样依赖于C2DM,它没有任何"额外"的东西.此外,GTalk不存在于所有设备上.我不确定GTalk应用程序如何确定它是否脱机(不幸的是它不是开源的),但我猜它只是试图ping服务器并失败.


Tof*_*mad 7

不,那是不可能的.因为你的设备经过一次身份验证并生成注册ID并发送到第三方服务器(如你所知).现在,你的工作已经完成,一旦设备被注册,你的工作就结束了.所以等待你得到的消息(否)保证在C2DM使用UDP协议时传递消息.

替代方案

虽然我无法直接从Google方面检查,但是如果您有任何紧急情况需要通过手机查看连接,那么您可以采取这样的方式

步骤1):创建一个Web服务以检查连接

步骤2):从应用程序调用此Web服务,该应用程序将命令服务器发送推送通知以进行检查.

步骤3):现在从服务器端,服务器将立即发送特定设备的推送通知(它获取命令的FROM)

步骤4):现在,如果你有推送通知,这意味着你仍然连接到C2DM.

这不会花费太多时间.但只有当检查连接是紧急的并且它在用户上时才遵循它