У меня есть серверное приложение, которое отправляет уведомления GCM push. Каждая отправка 1000 получателей возвращает сообщение, которое сообщает мне статус каждого регистрационного идентификатора. У некоторых будут коды ошибок. Есть ли где-то документ от Google, который говорит мне, как я должен обрабатывать эти коды и какие все возможные коды ошибок? Мой Google foo ничего не активирует.
Коды ошибок GCM
Ответ 1
Ты выглядел недостаточно усердно. Все коды описаны здесь в разделе Interpreting an error response
.
Я попытался скопировать и вставить его, чтобы он не был ответом только по ссылке, но форматирование немного отключено:
Интерпретация ответа об ошибке
Вот рекомендации по обработке различных типов ошибок, которые могут возникнуть при попытке отправить сообщение на устройство:
Отсутствует идентификатор регистрации. Убедитесь, что запрос содержит идентификатор регистрации (либо в параметре registration_id в текстовом сообщении, либо в поле registration_ids в JSON). Происходит, когда код ошибки MissingRegistration.
Неверный регистрационный идентификатор Проверьте формат регистрационного идентификатора, который вы передаете на сервер. Убедитесь, что он соответствует регистрационному идентификатору, который телефон получает в намерении com.google.android.c2dm.intent.REGISTRATION, и что вы не усекаете его или не добавляете дополнительные символы. Происходит, когда код ошибки InvalidRegistration.
Несоответствующий отправитель. Идентификатор регистрации привязан к определенной группе отправителей. Когда приложение регистрируется для использования GCM, оно должно указать, каким отправителям разрешено отправлять сообщения. Убедитесь, что вы используете один из них при попытке отправить сообщения на устройство. Если вы переключитесь на другого отправителя, существующие регистрационные идентификаторы не будут работать. Происходит, когда код ошибки MismatchSenderId.
Незарегистрированное устройство Существующий регистрационный идентификатор может перестать действовать в ряде сценариев, включая:
- Если приложение вручную отменяет регистрацию, введя намерение com.google.android.c2dm.intent.UNREGISTER.
- Если приложение автоматически незарегистрировано, что может произойти (но не гарантируется), если пользователь удалит приложение.
- Если срок действия регистрационного удостоверения истекает. Google может решить обновить регистрационные идентификаторы.
- Если приложение обновлено, но в новой версии не настроен приемник широковещания для получения намерений com.google.android.c2dm.intent.RECEIVE.
Во всех этих случаях вы должны удалить этот регистрационный идентификатор со стороннего сервера и прекратить использовать его для отправки сообщений. Бывает, когда код ошибки не зарегистрирован.
Сообщение слишком большое Общий размер данных полезной нагрузки, включенных в сообщение, не может превышать 4096 байт. Обратите внимание, что это включает в себя как размер ключей, так и значения. Бывает, когда код ошибки - MessageTooBig.
Неверный ключ данных Данные полезной нагрузки содержат ключ (например, from или любое значение с префиксом google.), Который используется GCM для внутренних целей в намерении com.google.android.c2dm.intent.RECEIVE и не может использоваться. Обратите внимание, что некоторые слова (такие как collapse_key) также используются GCM, но разрешены в полезной нагрузке, и в этом случае значение полезной нагрузки будет переопределено значением GCM. Происходит, когда код ошибки InvalidDataKey.
Недопустимое время жизни Значение поля "Время жизни" должно быть целым числом, представляющим продолжительность в секундах от 0 до 2 419 200 (4 недели). Происходит, когда код ошибки InvalidTtl.
Ошибка аутентификации Учетная запись отправителя, которую вы пытаетесь использовать для отправки сообщения, не может быть аутентифицирована. Возможные причины:
- Заголовок авторизации отсутствует или имеет неверный синтаксис.
- Неверный номер проекта отправлен как ключ.
- Ключ действителен, но с отключенной службой GCM.
- Запрос возник с сервера, не занесенного в белый список в IP-адресе ключа сервера.
Убедитесь, что токен, который вы отправляете внутри заголовка авторизации, является правильным ключом API, связанным с вашим проектом. Вы можете проверить правильность своего ключа API, выполнив следующую команду:
api_key = YOUR_API_KEY
curl --header "Authorization: key = $ api_key" --header Тип содержимого: "application/json" https://android.googleapis.com/gcm/send -d "{\" registration_ids\": [\ "ABC \"]}"
Если вы получили код состояния 401 HTTP, ваш ключ API недействителен. В противном случае вы должны увидеть что-то вроде этого:
{ "Multicast_id": 6782339717028231855, "успех": 0, "провал": 1, "canonical_ids": 0, "Результаты": [{ "ошибка": "InvalidRegistration"}]}
Если вы хотите подтвердить действительность регистрационного идентификатора, вы можете сделать это, заменив "ABC" регистрационным идентификатором. Бывает, когда код состояния HTTP 401.
Тайм-аут Сервер не смог обработать запрос вовремя. Вы должны повторить тот же запрос, но вы ДОЛЖНЫ выполнить следующие требования:
Запомните заголовок Retry-After, если он включен в ответ от сервера GCM. Реализуйте экспоненциальный откат в вашем механизме повтора. Это означает экспоненциально увеличивающуюся задержку после каждой неудачной попытки (например, если вы ждали одну секунду до первой попытки, подождите не менее двух секунд до следующей, затем 4 секунды и т.д.). Если вы отправляете несколько сообщений, отложите каждое из них независимо на дополнительную случайную сумму, чтобы избежать одновременного создания нового запроса для всех сообщений. Отправители, которые вызывают проблемы, могут оказаться в черном списке. Происходит, когда код состояния HTTP находится между 501 и 599, или когда поле ошибки объекта JSON в массиве результатов недоступно.
Внутренняя ошибка сервера Сервер обнаружил ошибку при попытке обработать запрос. Вы можете повторить тот же запрос (соблюдая требования, перечисленные в разделе "Время ожидания"), но если ошибка не устранена, сообщите о проблеме в группу android-gcm. Происходит, когда код состояния HTTP равен 500 или когда поле ошибки объекта JSON в массиве результатов имеет значение InternalServerError.
Неверное имя пакета Сообщение было адресовано регистрационному идентификатору, имя пакета которого не соответствовало значению, переданному в запросе. Происходит, когда код ошибки InvalidPackageName.
РЕДАКТИРОВАТЬ (06/06/2015):
Новая таблица кодов ответов об ошибках была размещена здесь.
Новые сообщения об ошибках:
Превышена скорость сообщений на устройстве Скорость сообщений на определенное устройство слишком высока. Уменьшите количество сообщений, отправляемых на это устройство, и не пытайтесь немедленно повторить попытку отправки на это устройство.
Превышена частота сообщений в темах Скорость сообщений для подписчиков определенной темы слишком высока. Уменьшите количество сообщений, отправляемых по этой теме, и не пытайтесь сразу же повторить отправку.
РЕДАКТИРОВАТЬ (21/07/2019):
Новая таблица кодов ответов об ошибках была размещена здесь.