Android 猜测C2DM是否连接的方法

Android 猜测C2DM是否连接的方法,android,google-talk,android-c2dm,Android,Google Talk,Android C2dm,我试图对是否可以接收C2DM消息进行最佳猜测估计 我创建了一个应用程序,它依赖于在手机无法访问时将信息推送到手机上。我知道C2DM不能保证传递,但我至少想知道什么时候可以传递消息;如果不是这样,我们会退回到自己的推送服务(并且实际上可以告诉我们何时连接) 我注意到,安卓上的C2DM即使没有登录谷歌账户,也会发出身份验证令牌;在这种情况下,消息似乎仍然被传递,即使声明它们不应该被传递。如果未连接GTalk(防火墙或其他原因),则在请求身份验证令牌时将根本不返回响应。当手机处于飞行模式时,验证令牌将

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

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

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


同样,我不需要保证消息的传递,但我至少想知道传递是否可能。有人有有趣的解决方案吗?

如果设备无法访问,即使您的回退推送消息系统也无法工作。C2DM不能保证它会传递您的消息,但不传递的事件将非常罕见。其他服务也是如此。最好的解决方法是轮询服务器,检查是否有任何尚未发送的新邮件。我假设您的应用程序是这样的,在500条或1000条中,即使是一条消息也不要漏掉,这一点非常重要。在这种情况下,您可以实现推送和拉送的混合。

我对C2Dm做了一些工作,我创建了自己的推送第三方服务器。 我实现了一个基于逻辑的oh C2DM http响应代码,以了解推送消息是否已发送。 以下是我使用的一些代码:

int responseCode = conn.getResponseCode();

    if (responseCode == HttpServletResponse.SC_UNAUTHORIZED || responseCode == HttpServletResponse.SC_FORBIDDEN) {

        LOGGER.warn("Unauthorized - need token");

        return false;
    }
在这里,我几乎可以肯定推送消息是从c2dm服务器发送的,因为我在响应中有一个id:

if (responseParts[0].equals("id")) {
        LOGGER.info("Successfully sent data message to device: " + responseLine);

        return true;
    }
如果你愿意的话,我已经用其他方法从谷歌获得了其他结果代码。我希望我能帮你一点忙。

去看看,这是一个关于C2DM的谷歌I/O讨论,如何使用它以及它是如何工作的。抱歉,你不知道它是否连接。可能大多数时候他们甚至都不知道(直到他们不得不传递一条信息并失败)

但是,强烈建议(在视频中也是如此)不要通过C2DM发送重要数据(因为消息可能会丢失)。该服务应仅用作“网络备忘录”(占用空间尽可能小)。您的应用程序应该被这个问题唤醒,它应该开始获取它自己所需要的信息

现在,如果您以这种方式实现它,那么实现轮询机制应该很容易。由于您已经将“挠痒”与实际的信息检索分开,如果没有挠痒,您可以每隔一段时间触发一次检索

检查C2DM是否连接的方法类似于ping:

  • 通过C2DM向手机发送信息
  • 应用程序接收(或不接收)消息,并向服务器发送“乒乓”
  • 在将设备标记为“脱机”之前,服务器等待“pong”一段预定的时间(我想是1-2分钟)

  • 编辑:依赖GTalk是不可行的。GTalk和你的应用程序一样依赖C2DM,它没有任何“额外”功能。此外,并非所有设备上都存在GTalk。我不确定GTalk应用程序如何确定它是否离线(不幸的是,它不是开源的),但我猜它只是尝试ping一个服务器并失败。

    我不认为有任何方法可以预先确定推送尝试是否可行,但我可以想出一个相当简单的方法来验证接收(但不要排队等待将来通过C2DM的传递)——只需完成消息循环即可

    请记住,C2DM的主要优点是它允许在手机处于睡眠状态且名义上处于脱机状态时发出通知。一旦您的应用程序收到通知,就没有什么可以阻止您在此时唤醒手机、启动网络并发送确认。我想您甚至不必请求“保持手机处于唤醒状态”权限,因为我相信注册C2DM通知并收到通知就足以唤醒手机,让应用程序继续正常运行(至少,足够长的时间启动网络并发送确认)

    当你这样做的时候,你应该跟踪那些在你预期失败后很久才发生的确认信息。如果你看到的信息不止一个,你可能不得不改变重发策略


    现实世界中唯一一个可能失败的边缘案例是,如果用户在启用语音/短信的同时竭尽全力禁用数据(我很确定C2DM在电话轮询来电和短信时使用了4字节的响应数据报,这些来电和短信最初是为RIM预留的,后来又为苹果和谷歌重新调整用途).

    不,这是不可能的。当您对设备进行一次身份验证并生成注册ID并发送到第三方服务器时(如您所知)。现在,设备注册后,您的工作就结束了。因此,请等待您收到或未收到的消息(不保证以C2DM使用UDP协议的方式发送消息)

    替代解决方案

    虽然正如我上面提到的,直接从谷歌方面进行检查是不可能的,但如果您有任何紧急情况需要检查您手机的连接 然后你可以采取这样的方法

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

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

    步骤3):现在从服务器端开始,服务器将使用immedia