Android GCM和多个令牌

ear*_*art 15 android push-notification google-cloud-messaging

我在GCM中使用GoogleCloudMessaging.getInstance(context)注册; 并将收到的令牌保存在设备上.然后将其发送到服务器,它与用户帐户相关联.如果我卸载我的应用程序而没有注销并再次安装并与其他用户一起登录,我会收到新令牌并将其发送到服务器.当推送发送给第一个用户时,我在第二个用户登录时看到它们.

为什么GCM会向我发送不同的令牌,我该如何处理?

nKn*_*nKn 11

欢迎来到来自的重复消息的奇妙世界Google Cloud Messaging.当发生这种情况时,GCM引擎可以Canonical IDs解决它.这可能是因为您为同一设备注册了多个ID,或者因为在卸载应用程序时GCM服务器未unregister()接到呼叫.使用规范ID会将您的ID设置为您最后一次注册.

根据GCM reference这个:

规范ID

在服务器端,只要应用程序运行良好,一切都应该正常工作.但是,如果应用程序中的错误触发同一设备的多个注册,则可能很难协调状态,并且最终可能会出现重复的消息.

GCM提供了一个名为"规范注册ID"的工具,可以轻松地从这些情况中恢复.规范注册ID定义为应用程序请求的最后一次注册的ID.这是服务器在向设备发送消息时应使用的ID.

如果稍后您尝试使用不同的注册ID发送消息,GCM将照常处理请求,但它将在响应的registration_id字段中包含规范注册ID.确保使用此规范ID替换存储在服务器中的注册ID,因为最终您使用的ID将停止工作.

更多信息在这里.

还有一个关于如何开始的实际案例,它可能会有所帮助:


Era*_*ran 5

我在卸载应用程序时遇到了注册ID更改,尝试在应用程序卸载时发送消息(直到我收到NotRegistered错误)然后重新安装.

来自Google的Costin Manolache 建议以这种方式处理注册ID更改:

建议/解决方法是生成您自己的随机标识符,例如保存为共享首选项.在每次应用升级时,您都可以上传标识符和可能的新注册ID.这也可以帮助跟踪和调试服务器端的升级和注册更改.

当然,这仅在应用程序保持安装时才有效(因为应用程序删除了共享首选项).但是,如果设备具有外部存储,则可以在其中存储标识符,并在再次安装应用程序时,从外部存储加载存储的标识符.这样您就会知道新的注册ID和旧注册ID属于同一设备.

此外,您应该在服务器中处理来自Google的规范注册ID响应,如其他答案中所述.