我想知道是否有人在Google C2DM遇到过这个问题?这是我面临的情景:
现在我从我的服务器向用户的手机发送消息,他们收到重复的消息。
任何人都可以了解这是预期的行为或我如何解决它? 谢谢,
答案 0 :(得分:7)
不确定这是否是最好的做法,但thread组有一个相关android-c2dm结束,海报提供了一种技巧:
我正在邮件中发送注册ID,因此我可以根据设备上存储的注册ID进行检查。
如果不相同,请将其丢弃并通知服务注册ID不再使用
下行正在发送注册ID已占用一些空间 有限的邮件大小。但是,自从我的案例以来,我的案 原始消息不超过几个字符长。
答案 1 :(得分:4)
只有在重新安装应用程序后第一次推送通知才会发生这种情况。
Google C2DM服务在检测已卸载的应用程序时处于被动模式。
卸载应用程序后的第一次推送通知(无需从C2DM取消注册!!!)将不会返回任何错误响应。但是,第二个推送通知将返回“无效注册”或“未注册”错误代码,您可以在其中意识到已卸载该应用程序。
原因是C2DM服务器立即返回响应代码,然后才尝试推送客户端。当客户端响应卸载了某个应用程序时,它将从C2DM服务器中删除。下次尝试将立即返回错误代码。
答案 2 :(得分:1)
另一种解决方案可能是为您的服务器提供设备的唯一标识符。在这种情况下,您可以在重新安装后尝试注册时更新该UUID的registrationID。
答案 3 :(得分:0)
我使用的解决方法是将注册ID的最后10个字符作为c2dm有效负载的一部分发送,然后在我的onMessage方法中执行以下检查:
if (!regId.endsWith(bundle.getString("regsuffix"))) return null;
答案 4 :(得分:0)
@Zamel和@johan的答案都很好,需要合并。如果您将两种解决方案结合起来,那么最小化服务器的数据库。
所以最好的解决方案是:
将推送令牌发送到服务器时发送设备ID
为现有设备ID发送时更新推送令牌
当推送令牌被识别为"无效注册"或"未注册"您可以使其无效(将其标记为null),删除数据库中的行或实现过期功能。这取决于您的需求