【问题标题】:How to get Canonical ID from GCM如何从 GCM 获取规范 ID
【发布时间】:2014-11-22 00:52:17
【问题描述】:

我正在尝试为我的设备获取一个唯一 ID,以便从我的服务器接收推送通知。

正如所有教程所说:我使用 GMC 注册:

  GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
  String regid = gcm.register(PROJECT_NUMBER);  // <---- duplicated if uninstalled/ reinstalled
  SendRegIdToServer(regId);

现在,我将 regId 发送到我的服务器并保存在设备上。

卸载重装时出现问题,由于本地存储丢失,我要求GCM重新注册并获得一个新的注册ID。因此,我的服务器有相同设备的副本。

我查看了很多关于 GCMRegistrar 的问题,现在已弃用。 人们说使用Canonical ID,这是唯一的。但是我怎么得到它呢?

我正在使用 gcm.register 并使用该 ID,这显然是在服务器上复制的。

感谢任何帮助。

【问题讨论】:

    标签: android google-cloud-messaging


    【解决方案1】:

    当您从服务器向 google 的 gcm 服务器发送消息时,响应中会返回规范 ID。

    https://developer.android.com/google/gcm/http.html#response

    解释成功响应

    当一个 JSON 请求成功(HTTP 状态码 200)时,响应 body 包含一个带有以下字段的 JSON 对象:

    字段 描述 multicast_id 标识 多播消息。成功处理的消息数 没有错误。失败的消息数 处理。 canonical_ids 包含规范的结果数 注册标识。有关此问题的更多讨论,请参阅高级主题 话题。 results 表示状态的对象数组 处理的消息。对象的列出顺序与 请求(即,对于请求中的每个注册 ID,其结果是 在响应中的相同索引中列出)并且他们可以拥有这些 字段:message_id:表示消息的字符串 成功处理。 registration_id:如果设置,则表示 GCM 处理了该消息,但它具有另一个规范注册 ID 该设备,因此发件人应在以后的请求中替换 ID (否则他们可能会被拒绝)。如果有,则永远不会设置此字段 是请求中的错误。错误:描述错误的字符串 在处理该收件人的邮件时发生。可能的 值与上表中记录的相同,加上 “不可用”(意味着 GCM 服务器很忙,无法处理 该特定收件人的消息,因此可以重试)。如果 failure和canonical_ids的值为0,不需要解析 响应的其余部分。

    更新

    以下是有关规范 ID 的更多信息。基本上,如果设备 reg id 与 Google 认为的不同步,那么当您的服务器发送带有不同步 id 的请求时,gcm 服务器将在其响应中包含正确的 id以后会用到。

    想一想,它的工作方式是;当设备向 gcm 注册时,您的服务器应该已经存储了 reg id。您的服务器使用该 id 向 gcm 发送请求,gcm 使用该 id 向您的设备发送消息。 GCM 无法在不告知服务器的情况下获取您设备上的 reg id。如果确实如此,您的服务器将继续发送错误的 reg id。相反,gcm 告诉服务器它用于特定设备的 reg id 是错误的,然后您的服务器可以向设备发送消息以将其存储的 reg id 更新为应有的值,然后设备可以确认更改在 REG ID 中。下面的信息意味着有一些时间限制,“坏” id 仍然可以用于发送消息多长时间。我认为假设是它应该足够长让您的服务器更改设备 ID(通过使用“坏”ID 的 gcm 消息)

    规范 ID

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

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

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

    【讨论】:

    • 我一直在想我应该从我的 Android 设备对 gcm 的调用中获取规范 ID。这不是真的吗?
    • 感谢您的详细解释。我正在开发客户端应用程序,而其他人正在做服务器端。您描述的所有内容似乎都是我们的服务器开发人员应该做的事情。具体来说,从客户端的角度来看,除了注册并保存该 ID 并将其发送到后端以避免重复 ID 之外,客户端还能做什么?
    • 我正在使用 Azure Notification Hub 进行通知,那么这是 Microsoft 需要解决的问题吗?我只是从他们的门户发送通知,我不参与保存 PNSHandle 或发送通知
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多