android - 如何使 GCM 与应用程序和服务器保持同步?

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

最佳答案

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

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

关于android - 如何使 GCM 与应用程序和服务器保持同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552316/

相关文章:

javascript - 如何通过 promise 映射

iOS - 检查应用程序中的推送通知支持

react-native - react native 本地通知

java - 通过改造调用 api 时,尝试在空对象引用错误上调用虚拟方法 'int java.util.ArrayList.size()'

nativemessaging 应用程序和 webextension 之间的异步双向消息传递?

javascript - 操作创建者的异步代码导致错误

android - Firebase 发送多个推送通知而不是堆叠或替换

android - 向 Django 后端验证 Android 或 iPhone 应用程序

java - content_main.xml 与 activity_main.xml

android - jsb.reflection.callStaticMethod 不工作