如何从GCM获取Canonical ID

tec*_*rer 6 android google-cloud-messaging

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

正如所有的turorial所说:我使用GMC注册:

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

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

当我卸载并重新安装时出现问题,因为本地存储丢失了,我要求GCM再次注册,我得到一个新的注册ID.因此,我的服务器正在使用相同设备的副本.

我在GCMRegistrar上看了很多问题,现在已经弃用了.人们说使用Canonical ID,这是独一无二的.但我怎么得到它?

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

感谢任何帮助.

nPn*_*nPn 10

当您从服务器向Google的gcm服务器发送邮件时,会在响应中返回Canonical ID.

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

解释成功回应

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

字段说明multicast_id标识多播消息的唯一ID(编号).success没有错误处理的消息数.failure无法处理的消息数.canonical_ids包含规范注册ID的结果数.有关此主题的更多讨论,请参阅高级主题.results表示已处理消息状态的对象数组.对象以与请求相同的顺序列出(即,对于请求中的每个注册ID,其结果在响应中的相同索引中列出)并且它们可以具有以下字段:message_id:表示消息时的字符串成功处理.registration_id:如果设置,表示GCM处理了该消息,但它具有该设备的另一个规范注册ID,因此发送方应在将来的请求中替换ID(否则它们可能会被拒绝).如果请求中存在错误,则永远不会设置此字段.error:描述处理该收件人的邮件时发生的错误的字符串.可能的值与上表中记录的相同,加上"不可用"(意味着GCM服务器很忙,无法处理该特定收件人的消息,因此可以重试).如果failure和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中.下面的信息表明存在一些时间限制,因为"坏"ID仍然可以用于发送消息多长时间.我认为假设它应该足够长,以便您的服务器更改设备ID(通过使用"坏"ID的gcm消息)

规范ID

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

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

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