如何从GCM获取Canonical ID

时间:2014-11-22 00:52:17

标签: android google-cloud-messaging

我正在尝试获取设备的唯一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,这显然是在服务器上重复。

感谢任何帮助。

1 个答案:

答案 0 :(得分:10)

当您从服务器向Google的gcm服务器发送消息时,会在响应中返回Canonical ID。

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

  

解释成功回应

     

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

     

字段说明multicast_id标识的唯一ID(编号)   组播消息。 success已处理的消息数   没有错误。 failure无法发送的消息数   处理。 canonical_ids包含规范的结果数   注册ID。有关详细信息,请参阅高级主题   话题。 results表示状态的对象数组   消息已处理。对象的列出顺序与   请求(即,对于请求中的每个注册ID,其结果是   列出在响应中的相同索引中)他们可以拥有这些   fields:message_id:表示消息的字符串   成功处理。 registration_id:如果设置,表示GCM   处理了邮件,但它有另一个规范的注册ID   该设备,因此发件人应在将来的请求中替换ID   (否则他们可能会被拒绝)。如果存在,则永远不会设置此字段   是请求中的错误。 error:描述错误的字符串   处理该收件人的邮件时发生。可能   值与上表中记录的相同,加上   &#34;未提供&#34; (意味着GCM服务器很忙,无法处理   该特定收件人的消息,因此可以重试)。如果   fail和canonical_ids的值为0,不需要解析   答案的其余部分。

<强>更新

以下是有关Canonical ID的更多信息。基本上,如果设备注册与Google认为它应该是不同步的,那么当您的服务器发送带有不同步ID的请求时,gcm服务器将包含其中的响应,正确的ID将来会被使用。

想想看,它的工作方式是;当设备注册gcm时,您的服务器应该存储了reg id。您的服务器向具有该ID的gcm发送请求,gcm使用该ID向您的设备发送消息。 GCM可以在您的设备上注册,而无需告知服务器。如果它确实你的服务器将继续发送错误的注册ID。相反,gcm告诉服务器它正在用于特定设备的reg id是坏的,然后你的服务器可以向设备发送消息以将其存储的reg id更新为它应该是什么,然后设备可以响应更改在REG ID中。下面的信息表明存在一些时间限制,因为&#34;坏&#34; id仍可用于发送消息。我认为假设它应该足够长,以便您的服务器更改设备ID(通过gcm消息使用&#34;坏&#34; id)

Canonical ID

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

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

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