Идентификатор регистрации дубликатов Android для разных устройств

Я вижу эту проблему на моем сервере push-уведомлений - разные устройства Android (идентифицированные их IMEI) получают ИДЕННЫЙ идентификатор регистрации из службы Google GCM. Не является ли идентификатор регистрации уникальным? на востоке для того же приложения или ключа API GCM?

Я видел эту ветку, но, похоже, там нет ответа: Может ли у двух разных устройств одинаковый идентификатор регистрации GCM?

Любая помощь будет высоко оценена

ИЗМЕНИТЬ вот соответствующий код для регистрации:

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

Ответ 1

Иногда Google меняет идентификатор регистрации, и у вас будет несколько идентификаторов. Сервер, отправляющий уведомление (ваш сервер), должен обновить базу данных новым идентификатором.

Для получения дополнительной информации проверьте этот документ:

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

они говорят:

Это канонические идентификаторы

На стороне сервера, пока приложение ведет себя хорошо, все должно работать нормально. Однако, если ошибка в приложении запускает несколько регистраций для одного и того же устройства, может быть сложно и вы можете получить дубликаты сообщений.

GCM предоставляет средство, называемое "канонические регистрационные идентификаторы", легко из этих ситуаций. Определен канонический идентификатор регистрации чтобы быть идентификатором последней регистрации, запрошенной вашим приложением. Это идентификатор, который сервер должен использовать при отправке сообщений на устройство.

Если позже вы попытаетесь отправить сообщение, используя другую регистрацию ID, GCM будет обрабатывать запрос как обычно, но он будет включать канонический регистрационный идентификатор в поле registration_id ответ. Обязательно замените идентификатор регистрации, сохраненный в вашем сервер с этим каноническим идентификатором, поскольку в конечном итоге идентификатор, который вы используете, будет перестаньте работать.

Ответ 2

Единственная идея, которая приходит мне на ум, заключается в том, что этот устаревший метод назначит один и тот же идентификатор на разных устройствах, если дополнительное значение для sender одинаково для всех. Это отличается от текущей версии, где вы не говорите, кто вы, вы даже не отправляете Intent, вы просто вызываете register(), а Google определяет, кто вы и какой идентификатор вам нужно дать.

Если вы, наконец, используете эту новую библиотеку, есть примерный фрагмент того, как зарегистрироваться (внутри AsyncTask или Thread):

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

Ответ 3

Хорошо, добавив свой регистрационный код, я вижу, что вы используете старый метод регистрации. Этот метод был снят с середины прошлого года. Вероятно, он будет менее надежным, чем новый метод регистрации.

Вам следует попробовать зарегистрироваться через метод GoogleCloudMessaging.register в библиотеке Служб Google Play. Это рекомендуется Google. См. Официальное демо здесь.