Подтвердить что ты не робот

При отправке сообщений с использованием GCM я продолжаю получать ответ "MismatchSenderId",

Я реализую сервер push-уведомлений с GCM. Я отправляю почтовый запрос с идентификатором отправителя (ключ приложения), который я получил из Консоли API Google, и идентификатор регистрации, который я получил от службы GCM.

Опубликованный JSON включает в себя один идентификатор регистрации. Я всегда получаю тот же ответ:

{
  "multicast_id":8546528660791862014,
  "success":0,
  "failure":1,
  "canonical_ids":0,
  "results":[
    {
      "error":"MismatchSenderId"
    }
  ]
}

В чем может быть проблема? Что я делаю неправильно?

4b9b3361

Ответ 1

См. сообщение о переполнении стека Почему я получаю "MismatchSenderId" со стороны сервера GCM?.

Из приведенного выше URL:

дважды проверьте идентификатор отправителя и API_KEY, они должны совпадать или вы получите ошибку MismatchSenderId. В консоли API Google просмотрите URL вашего проекта:

     https://code.google.com/apis/console/#project:xxxxxxxxxxx

Xxxxxxxxx - это идентификатор проекта, который является идентификатором отправителя.

Некоторые люди сообщают о проблемах с использованием ключей ключей "Key for Server Apps", но вместо этого имеют успех с использованием типа браузера. Лично тип Server Key работает для меня, но попробуйте оба, YMMV.

Ответ 2

Удалите приложение Android с устройства и снова запустите приложение.

Теперь вы получите новый регистрационный идентификатор. Это может решить вашу проблему MismatchSenderId в конкретном случае (иногда это происходит Если вы измените/обновите свой API ключ, но все еще используете старый регистрационный ключ). В моем случае я сначала получил идентификатор регистрации для своего устройства, а затем я изменил свой ключ API (на сервере Google GCM), а затем получил ошибку MismatchSenderId. Наконец, я удалил приложение Android с устройства, и проблема была решена.

Ответ 3

Войдите в Google Cloud Console

См. пример прилагаемого изображения:

enter image description here

Ответ 4

Вы должны использовать "Номер проекта" (то есть числовой идентификатор) для идентификатора отправителя, а не "Идентификатор проекта"

Ответ 5

Эта ошибка наверняка, потому что вы указали неверный SenderID при регистрации своего устройства:

Вот пример регистрационного запроса (скрипач)

POST https://android.clients.google.com/c2dm/register3 HTTP/1.1 Host: android.clients.google.com Подключение: keep-alive Content-Length: 83 Авторизация: AidLogin 51734556544354357: 9087138434543543508 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/39.0.2171.99 Safari/537.36 Accept-Encoding: gzip, deflate Accept-Language: en-US, en; q = 0.8, ar; q = 0.6, fr; q = 0.4

приложение = gpYOURAppHereloin & устройство = 5112132132137117 & отправитель = YourApplicationIDHere

Вы можете найти свой идентификатор отправителя с помощью следующих шагов

  • Откройте консоль Google Developers.
  • появится страница, отображающая ваш идентификатор проекта и номер проекта. Например, номер проекта: 67023432432. Скопируйте свой номер проекта и используйте его как идентификатор отправителя GCM.

Дополнительная информация:

Ответ 6

Я копировал код из tutorial, но забыл изменить номер проекта в исходном коде. Он генерировал идентификатор для учебного проекта автора, а не моего, поэтому убедитесь, что вы изменили исходный код в приложении для Android!

Ответ 7

Создайте ключ API из консоли API. Используйте браузерный ключ приложения в бэкэнд и используйте идентификатор проекта в качестве идентификатора отправителя в коде клиента.

Ответ 8

У меня была такая же проблема, но я сделал глупую глупость: у меня было несколько проектов на консоли Google, и я сгенерировал идентификатор регистрации для номера проекта, принадлежащего проекту, и я попытался отправить уведомления на ключ Api, который принадлежит к другому проекту. Первый шаг этой ошибки - проверить проект, с которым вы работаете.

Ответ 9

Обратите внимание, что если ваш идентификатор отправителя изменяется, метод Google Play Services com.google.android.gms.gcm.GoogleCloudMessaging.register() будет продолжать возвращать исходный идентификатор регистрации независимо от нового идентификатора отправителя. Вам нужно будет вызвать метод unregister() для одного класса для служб Google Play, чтобы обновить и уничтожить предыдущие устаревшие кешированные значения.

См. информацию об API здесь: com.google.android.gms.gcm.GoogleCloudMessaging.register()

В качестве альтернативы вы всегда можете удалить данные приложения или удалить-переустановить, как указано в предыдущем ответе, но это что-то далеко не приемлемое в рабочей среде.

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

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

Ответ 10

У меня есть аналогичная проблема, когда я тестировал код примера Google, найденный здесь https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/GcmEndpoints и что XYZ сказал действительно помогло мне решить этот вопрос.

Я смог отправить сообщения на свой телефон из своего API-интерфейса API движка Google в рамках метода messaging.messagingEndpoint.sendMessage, однако в журналах консоли Google для приложений Google всегда говорилось о MismatchSenderId. Ошибка регистрировалась, когда, очевидно, не было ошибки, которая вызывала у меня ошибку.

MismatchSenderId

Я был очень смущен, и вот как мне удалось это решить:

  • Удалите приложение Android с телефона.
  • Переустановите приложение для Android и обратите внимание на идентификатор reg.
  • Перейдите в API-профайлер в разделе Услуги > API регистрации v1 > registration.listDevices и перечислите весь свой RegID для GCM.
  • Скопируйте этот список где-нибудь - в блокнот.
  • Перейдите в API-профайлер в разделе Услуги > API регистрации v1 > registration.unregister и отмените регистрацию всех regID, которые не соответствуют тому, которое используется вашим приложением.

Повторите отправку сообщения, и на этот раз он должен работать без ошибки, записанной в журналах консоли приложения Google.

Ответ 11

Вам нужно проверить источник вашего идентификатора регистрации, вы не можете использовать идентификатор регистрации C2DM в сообщении сообщения GCM. В Google Doc:

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

При переходе с C2DM на GCM ваш сервер должен знать имеет ли данный идентификатор регистрации старый отправитель C2DM или новый Номер проекта GCM. Это тот подход, который мы рекомендуем: версия приложения (тот, который использует GCM) отправляет бит вместе с регистрационный номер. Этот бит сообщает серверу, что этот идентификатор регистрации для GCM. Если вы не получите дополнительный бит, отметьте регистрацию ID как C2DM. Как только недействительные регистрационные идентификаторы отмечены как C2DM, вы можете завершить миграцию.

Еще одна вещь, на которую стоит обратить внимание - это SENDER_ID, формат SENDER_ID является числовым, если вы используете InstanceID для получения RegistrationID, например

    InstanceID instanceID = InstanceID.getInstance(this);
    String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

SENDER_ID не может использовать имя проекта, используйте https://developers.google.com/mobile/add, чтобы получить "Ключ API-сервера" и "Удостоверение личности отправителя".