我正在尝试获取设备的唯一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,这显然是在服务器上重复。
感谢任何帮助。
答案 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将停止工作。