如何从 GCM 获取规范 ID



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

正如所有 turorial 所说:我使用 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,该ID显然在服务器上重复。

感谢任何帮助。

当您从服务器向 Google 的 GCM 服务器发送消息时,系统会在响应中返回规范 ID。

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

解释成功响应

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

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

更新

以下是有关规范 ID 的更多信息。 基本上,如果设备注册ID以某种方式与Google认为应该不同步,那么当您的服务器发送具有不同步ID的请求时,gcm服务器将在其响应中包含正确的id将来使用。

想想看,这是工作方式; 当设备向GCM注册时,您的服务器应该存储注册ID。 您的服务器使用该 ID 向 gcm 发送请求,gcm 使用该 ID 向您的设备发送消息。GCM 无法在不告知服务器的情况下在您的设备上显示注册 ID。 如果是这样,您的服务器只会继续发送错误的注册ID。 相反,gcm 告诉服务器它用于特定设备的注册 ID 是错误的,然后您的服务器可以向设备发送一条消息,将其存储的注册 ID 更新为应有的状态,然后设备可以确认 REG ID 中的更改。 下面的信息暗示有一些时间限制,因为"坏"ID仍然可以用于发送消息的时间。 我认为假设它应该足够长,以便您的服务器更改设备 ID(通过使用"错误"ID 的 gcm 消息)

规范身份证

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

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

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

最新更新