如何在应用程序中正确更新 GCM 注册 ID

Posted

技术标签:

【中文标题】如何在应用程序中正确更新 GCM 注册 ID【英文标题】:How to update properly GCM registration id in application 【发布时间】:2013-08-20 17:49:24 【问题描述】:

我正在尝试创建一个使用推送通知的应用。我已经完成了 3rd-party 服务器和应用程序开发中的所有工作,并且通知已成功发送。

在应用程序的这个特定部分,用户将通过特定的服务注册到 GCM 和第三方服务器,然后将他想要通知的足球比赛上传到第三方服务器。完全的。

我面临的问题是,当我卸载应用程序时,GCM 服务器(当我发送消息时)没有响应 NotConnected 错误。因此,当我重新安装应用程序时,GCMRegistrar 会为我提供一个新的注册 ID,这会使我的服务器为同一用户拥有两个不同的注册 ID。

虽然我可以在规范 id 的帮助下解决这个问题。谷歌特别说

"canonical_ids": 1    
"results": [ "message_id": "1:2342", "registration_id": "32" ]

成功,但是注册ID应该在服务器数据库中更新(从23到32)

因此,如果我听从 google 的建议,将注册 id 更改为旧的(工作)注册 id,这将导致应用程序使用新的注册 id 将足球比赛发送到具有此特定新注册的服务器id 和服务器将不知道在哪里存储此信息。

我知道注册 id 不是用户的 id 而是注册设备的 id。

我的第一个想法是让服务器有不同的注册ID。所以当我得到一个规范的 id 时,我会忽略它。不过我不喜欢这个主意……

我的第二个想法是当我将注册 ID 更改为旧的,以某种方式将其更新到应用程序中......

谁能告诉我哪个听起来更适合我的情况?这是我第一次使用推送通知...

【问题讨论】:

【参考方案1】:

所以,如果我听从 google 的建议,将注册 ID 更改为旧的(工作的)ID

这与 Google 告诉您的做法相反。他们鼓励您从数据库中删除旧 ID,只保留新的注册 ID。

这是relevant quote:

规范 ID

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

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

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

【讨论】:

以上是关于如何在应用程序中正确更新 GCM 注册 ID的主要内容,如果未能解决你的问题,请参考以下文章

GCM 的注册 ID 重复

Android GCM:如何在我自己的服务器中检测注册的规范 ID?

GCM'错误:未注册'

如何将 GCM 注册 ID 唯一地存储到 MySQL 中

GCM注册ID过期时间

规范注册 id gcm