3

我正在将 GCM 用于应用程序通知,如此处所示。代码是样板:

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 之间的一致性的最简单/最干净的方法是什么? 谢谢。

4

1 回答 1

2

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

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

于 2013-03-21T16:21:51.303 回答