Android C2DM:将消息复制到同一设备和应用程序

时间:2011-07-06 11:56:28

标签: android android-c2dm

我想知道是否有人在Google C2DM遇到过这个问题?这是我面临的情景:

  1. 用户安装应用程序和注册 使用C2DM服务器进行注册 键。
  2. 用户卸载该应用。
  3. 用户重新安装应用程序(和 向C2DM服务器注册新的 注册密钥)。
  4. 现在我从我的服务器向用户的手机发送消息,他们收到重复的消息。

    任何人都可以了解这是预期的行为或我如何解决它? 谢谢,

5 个答案:

答案 0 :(得分:7)

不确定这是否是最好的做法,但thread组有一个相关android-c2dm结束,海报提供了一种技巧:

  

我正在邮件中发送注册ID,因此我可以根据设备上存储的注册ID进行检查。

     

如果不相同,请将其丢弃并通知服务注册ID不再使用

     

下行正在发送注册ID已占用一些空间   有限的邮件大小。但是,自从我的案例以来,我的案   原始消息不超过几个字符长。

答案 1 :(得分:4)

只有在重新安装应用程序后第一次推送通知才会发生这种情况。

Google C2DM服务在检测已卸载的应用程序时处于被动模式。

卸载应用程序后的第一次推送通知(无需从C2DM取消注册!!!)将不会返回任何错误响应。但是,第二个推送通知将返回“无效注册”或“未注册”错误代码,您可以在其中意识到已卸载该应用程序。

原因是C2DM服务器立即返回响应代码,然后才尝试推送客户端。当客户端响应卸载了某个应用程序时,它将从C2DM服务器中删除。下次尝试将立即返回错误代码。

答案 2 :(得分:1)

另一种解决方案可能是为您的服务器提供设备的唯一标识符。在这种情况下,您可以在重新安装后尝试注册时更新该UUID的registrationID。

答案 3 :(得分:0)

是的,我遇到了同样的问题,在我看来,这是Android C2DM实施中的一个重大疏忽。 iOS处理得更好,因为应用程序只能接收一个且只有一个设备令牌的通知(相当于c2dm注册ID)

我使用的解决方法是将注册ID的最后10个字符作为c2dm有效负载的一部分发送,然后在我的onMessage方法中执行以下检查:

    if (!regId.endsWith(bundle.getString("regsuffix"))) return null;

答案 4 :(得分:0)

@Zamel和@johan的答案都很好,需要合并。如果您将两种解决方案结合起来,那么最小化服务器的数据库。

所以最好的解决方案是:

  1. 将推送令牌发送到服务器时发送设备ID

  2. 为现有设备ID发送时更新推送令牌

  3. 如果推送通知返回"无效注册"则在服务器的数据库中使推送令牌无效。或"未注册"错误代码到服务器
  4. 当推送令牌被识别为"无效注册"或"未注册"您可以使其无效(将其标记为null),删除数据库中的行或实现过期功能。这取决于您的需求