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); 

  • 我们怎样才能得到Android的设备令牌推送通知?
  • Android模拟器没有收到推送通知
  • 获取GCM规范注册ID而不发送消息
  • 无法parsingcom.google.firebase:firebase-core:10.0.1
  • 点击Android Kitkat中未打开所需活动的GCM通知
  • GCM重复的消息
  • Android GCM不起作用
  • 无法实例化GcmBroadcastReceiver
  • 有时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推荐的方式。 看到这里的官方演示。