如何让GCM与应用和服务器保持同步?

时间:2013-03-21 15:56:26

标签: android asynchronous push-notification google-cloud-messaging

我正在使用GCM进行应用通知,如图所示here。代码是样板:

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);

final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
    GCMRegistrar.register(this, SENDER_ID);
} else {
    Log.v(TAG, "Already registered");
}

然后onRegistered()回调使用返回的注册ID更新我的服务器。

但是,有几次GCM进入了一个不一致的状态。在一种情况下,即使GCMRegistrar.getRegistrationId()给我一个非空的注册ID字符串,它也不会转发任何通知。在其他情况下,我最终得到两条或更多重复的消息。

为了避免这些情况,我目前有一个类似的蛮力解决方案:

if (GCMRegistrar.isRegistered(this))
    GCMRegistrar.unregister(this);
else
    GCMRegistrar.register(this, GCMConstants.SENDER_ID);

在onUnregistered()回调中,我告诉我的服务器删除注册ID,然后调用GCMRegistrar.register()。在onRegistered()回调中,我告诉我的服务器添加注册ID。

到目前为止,它正在发挥作用,但它的效率明显低于它的工作方式,而且我不确定它是否可以免受不一致性问题的影响。如果我可以指望getRegistrationId()始终返回有效的ID,即当前/规范的注册ID,那会更好。

确保我的应用,服务器和GCM之间的一致性最简单/最简洁的方法是什么?谢谢。

1 个答案:

答案 0 :(得分:2)

如果您解析从Google获得的回复,则可以解决获取重复邮件的问题,并确定在响应中收到规范注册ID的情况。在这种情况下,您可以删除旧的注册ID,并保留规范的ID。

我认为比您的强力解决方案更好的解决方案是在应用启动时始终呼叫register。您可以在onRegistered()中收到上次呼叫时获得的相同注册ID,但如果您在设备中保留该注册ID,则可以将持久ID与收到的ID进行比较,并避免重新发送注册ID你的服务器如果没有改变。