Отправить уведомление GCM автономному устройству

Если я отправляю уведомление на устройство, и это устройство отключено, я получаю что-то вроде:

Ошибка: недоступен

И мне нужно отправить его повторно.

Мой вопрос:

Будет ли сервер GCM хранить эти уведомления в очереди и автоматически повторно отправлять, когда устройство находится в сети? Или он должен быть полностью обработан мной.

Потому что, если сервер GCM отправит их автоматически (как только устройство будет в сети), пока он фактически не отправит уведомления, мой сервер предполагает, что они уже отправлены. Как отслеживать время, когда уведомления были успешно отправлены?

Я мог бы отметить на моей стороне сервера, что уведомления не отправляются, глядя на Unavailable error message но не могут определить, как отмечать их как отправленные после того, как GCM успешно отправит уведомления.

Спасибо

A / c к документации — Когда сторонний сервер отправляет сообщение в GCM и получает идентификатор сообщения обратно, это не означает, что сообщение уже доставлено на устройство. Скорее, это означает, что оно было принято для доставки. То, что происходит с сообщением после его принятия, зависит от многих факторов.

Если устройство подключено, но не работает, сообщение все равно будет доставлено сразу, если флажок delay_while_idle не установлен в true. В противном случае он будет храниться на серверах GCM до тех пор, пока устройство не проснется. И вот где флаг collapse_key играет роль: если уже есть сообщение с тем же ключом коллапса (и регистрационным ID), которое хранится и ждет доставки, старое сообщение будет отброшено, и новое сообщение займет свое место (то есть, Старое сообщение будет свернуто новым). Однако, если ключ коллапса не установлен, как новые, так и старые сообщения сохраняются для будущей доставки.

Примечание. Существует ограничение на количество сообщений, которые могут быть сохранены без сбоев. Этот предел в настоящее время равен 100. Если предел достигнут, все сохраненные сообщения будут отброшены.

То, что я сделал, это отделить указатель толчка от полезной нагрузки . В моем сообщении GCM я включаю только URI в полезную нагрузку, и я храню полезную нагрузку в таблице базы данных, доступной через URI в сообщении.

Когда клиент получает сообщение, он может выглядеть, например, с помощью ссылок стиля HATEOAS:

 { _links: { message: { rel: 'message', href: 'https://my-server.com/push/<messageId>' } } } 

Затем клиент переходит к GET сообщения из URI, после чего сервер знает, что он был доставлен и может соответствующим образом обновиться. Извлечение полезной нагрузки также удаляет ее.

Если повторная доставка GCM недостаточно надежна, это также означает, что клиент может вручную выбрать все ожидающие сообщения, например, когда сетевое подключение возобновляется после автономной работы, имея конечную точку, которая возвращает все сообщения для данного идентификатора ANDROID_ID или аналогичного. Если затем сообщение GCM будет доставлено, клиент получит в этом сообщении 404 для URI и будет рассматривать это как no-op, т. Е. Уже обработанное сообщение.

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

 POST https://my-server.com/push/notifyReceived { messageId: <messageId> } 
Intereting Posts
Android Как сделать слушателем пользовательскую переменную? Услуги Android: START_STICKY не работает в Kitkat Пользовательские кнопки треугольника Android SQLite или SharedPreferences для постоянного хранения данных? Потоковая загрузка VideoView не достаточно буферизирована Относительная компоновка на TabHost? «Невозможно выполнить это действие после onSaveInstanceState» – почему я получаю это исключение из метода onResume моей активности? Удалите предыдущий маркер и добавьте новый маркер в Google Map v2 Как применять размер шрифта при рендеринге HTML-кода на Android или Java Установить фокус активности в теме, используя стиль? Загрузка ресурсов изображений из https с помощью LoopJ AndroidAsyncHttp Как проверить, остановлен ли TtsService (или служба Android)? Как удалить функцию масштабирования из библиотеки mpchart android? Цвет панели инструментов Android не устанавливается цветом. Android – Как реализовать список как модальный диалог / всплывающее окно