【问题标题】:gcm canonical id should be updated or notgcm 规范 id 是否应该更新
【发布时间】:2014-05-17 10:49:12
【问题描述】:

我正在开发一个使用 gcm 的 android 项目。我开始知道,如果我们从设备上卸载应用程序并重新安装,大部分时间设备都会获得新的注册 ID。然后,如果我们不从应用程序服务器中删除旧的并更新,消息将发送到两个 id 和响应它将显示存在规范 ID。我的问题是,此时消息是否会成功发送到该设备?

【问题讨论】:

    标签: android push-notification google-cloud-messaging


    【解决方案1】:

    当您在 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,看来您是提出任何与 gcm 相关的问题的人:我通过将唯一 ID(用户名)与设备的 regid 一起存储在服务器上,对您的解决方案进行了轻微修改。如果我错了,请纠正我,但我应该没问题,因为我只允许每个用户一个 regid,我可以相应地更新。但是,这仍然假定设备将始终具有最新(和有效)的 regid。可以这样假设吗?
    • 第二个问题:除此之外,是否还有其他我应该注意的边缘情况,并确保我通过规范 id 更新用户的 regid(如果有)有提供吗?提前致谢。
    • 我忘了提到我正在使用与谷歌示例 gcm 应用程序完全相同的过程来注册 regid - 当 sharedpreferences 没有时。 (我为垃圾邮件道歉)
    • @user1164937 您的解决方案应该可以正常工作。如果您的应用程序每次获取新注册 ID 时都会更新服务器,并且服务器仅存储每个用户名的最新注册 ID,那么您甚至不应该在 GCM 服务器的响应中获得规范注册 ID。对于应用程序表现不佳的情况,需要规范的 reg ID 机制。我不知道任何其他极端情况。
    【解决方案2】:

    @Eran 我们有两个选择,要么删除旧的注册 ID,要么使用 Key 和规范 ID 的位置进行更新。我更喜欢更新...您可以查看我在这里回答的工作代码Steps to Update Canonical Ids

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多