Android重复注册ID为不同的设备

我在推送通知服务器上看到了这个问题 – 不同的Android设备(由他们的IMEI标识)从Google的GCM服务收到相同的注册ID。 注册ID是不是应该是唯一的? 在东方为相同的应用程序或GCM API密钥?

我看到这个线程,但似乎没有答案: 两个不同的设备可以有相同的GCM注册ID?

任何帮助将非常感激

这里编辑是相关的注册代码:

Intent intent = new Intent( "com.google.android.c2dm.intent.REGISTER"); intent.setPackage("com.google.android.gsf"); intent.putExtra("app", PendingIntent.getBroadcast(context, 0, new Intent(), 0)); intent.putExtra("sender", flatSenderIds); context.startService(intent); 

Solutions Collecting From Web of "Android重复注册ID为不同的设备"

有时Google会更改注册ID,并且您将拥有多个关联的ID。 发送通知的服务器(您的服务器)必须使用新的ID更新数据库。

有关更多信息,请查阅此文档:

http://developer.android.com/google/gcm/adv.html

他们说:

这是一个规范ID

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

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

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

我想到的唯一的想法是,如果sender的额外值在所有这些值上是相同的,那么这个被弃用的方法将在不同的设备上分配相同的ID。 这与现在的版本不同,你不说你是谁,你甚至不发送Intent ,你只需要调用register() ,Google决定你是谁,你应该给什么ID。

如果你最终使用这个新的库,有一个如何注册的例子(在AsyncTaskThread ):

 GoogleCloudMessaging gcm = null; try { // Will be for the first time if (gcm == null) gcm = GoogleCloudMessaging.getInstance(your_context); // Registration against the GCM service String regid = gcm.register(YOUR_SENDER_ID_OBTAINED_FROM_YOUR_PROJECT); // You'll need to send the registration info to your remote server registerRemoteServer(regid); Log.d("MyGCM", "Registered on GCM as " + regid); } catch (final IOException ex) { ex.printStackTrace(); } 

那么,在添加你的注册码后,我可以看到你正在使用旧的注册方法。 自去年年中以来,这个方法已经被定义了。 这可能不如新的注册方法可靠。

您应该尝试通过Google Play服务库的GoogleCloudMessaging.register方法进行注册。 这是Google推荐的方式。 看到这里的官方演示。