【发布时间】:2014-05-17 10:49:12
【问题描述】:
我正在开发一个使用 gcm 的 android 项目。我开始知道,如果我们从设备上卸载应用程序并重新安装,大部分时间设备都会获得新的注册 ID。然后,如果我们不从应用程序服务器中删除旧的并更新,消息将发送到两个 id 和响应它将显示存在规范 ID。我的问题是,此时消息是否会成功发送到该设备?
【问题讨论】:
标签: android push-notification google-cloud-messaging
我正在开发一个使用 gcm 的 android 项目。我开始知道,如果我们从设备上卸载应用程序并重新安装,大部分时间设备都会获得新的注册 ID。然后,如果我们不从应用程序服务器中删除旧的并更新,消息将发送到两个 id 和响应它将显示存在规范 ID。我的问题是,此时消息是否会成功发送到该设备?
【问题讨论】:
标签: android push-notification google-cloud-messaging
当您在 Google 的响应中收到规范注册 ID 时,GCM 服务器会接受该消息,并且 GCM 服务器会尝试将其传送到设备。是否实际发送到设备取决于设备是否可用(即连接到互联网)。 因此,如果您的服务器同时向旧 ID 和新 ID 发送 GCM 消息,则设备可能会收到两条消息。
规范 ID
在服务器端,只要应用程序运行良好, 一切都应该正常工作。但是,如果应用程序中的错误 触发同一设备的多个注册,可能很难 协调状态和您可能会收到重复的消息。
GCM 提供了一种称为“规范注册 ID”的工具,可以轻松地 从这些情况中恢复过来。定义了一个规范的注册 ID 作为您的应用程序请求的最后一次注册的 ID。 这是服务器在向服务器发送消息时应使用的 ID 设备。
如果稍后您尝试使用其他注册方式发送消息 ID,GCM 会照常处理请求,但会包含 的registration_id字段中的规范注册ID 回应。确保替换存储在您的注册 ID 具有此规范 ID 的服务器,因为最终您使用的 ID 将 停止工作。
(Source)
您可以通过为应用程序的每个实例分配唯一标识符来解决此问题。如果您将该标识符存储在设备的外部存储中,则在卸载应用程序时它不会被删除。然后,您可以在再次安装该应用程序时恢复它。如果您将此标识符与注册 ID 一起发送到您的服务器,您可以检查您的服务器是否有该标识符的旧注册 ID,并将其删除。
【讨论】:
@Eran 我们有两个选择,要么删除旧的注册 ID,要么使用 Key 和规范 ID 的位置进行更新。我更喜欢更新...您可以查看我在这里回答的工作代码Steps to Update Canonical Ids
【讨论】: