Intereting Posts
Изображения кэша локальные, из хранилища Google Firebase Как сгенерировать отчет о покрытии кода тестовых примеров Instrumentation в Android Studio Как Android определяет, имеет ли приложение «Высокое использование батареи» в разделе «Недавние запросы местоположения»? Более одного BroadcastReceiver для одного и того же намерения с противоречивым документом и практикой Robotium – настройка продолжительности PAUSE в классе Sleeper Как добавить левую выделенную в Spinner View в Android Можно ли использовать Mozilla Persona (BrowserID) с мобильными приложениями? Android: панель действий по умолчанию заполняется во время загрузки приложения Пример SSO в Facebook не работает – «Произошла ошибка. Пожалуйста, повторите попытку позже" Android API Google Drive «соединение не выполнено» Android Храните пакетный объект в SQLite Ошибка переключения навигации: нет идентификатора ресурса для атрибута «меню» в пакете Twitter4j => AndroidRuntime (446): java.lang.NoClassDefFoundError: twitter4j.http.AccessToken Загрузка текстур в приложение Android OpenGL ES Android-приложение вылетает на Lollipop

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

В настоящее время я пытаюсь использовать GCM для отправки уведомления пользователю, и в настоящее время я все еще изучаю, как я могу его максимизировать. На данный момент я просто использую образец проекта, представленный в документации, и я использую образец gcm-client для работы над ним.

Теперь, используя этот проект от Git, я попытался нажать сообщение, используя идентификатор регистрации, созданный приложением, и да, он успешно доставляет сообщение.

Теперь проблема в том, что после того, как я удалил приложение. После его переустановки он сгенерирует новый идентификатор регистрации, в котором я храню его на сервере вместе с предыдущим, за исключением того, что я не могу пометить предыдущий идентификатор регистрации, чтобы не получать никакого дополнительного сообщения, поскольку удаление может произойти, когда у пользователя нет Интернета подключение. После этого я отправляю сообщение до двух идентификаторов регистрации, которые являются идентификатором перед удалением приложения и идентификатора после повторной установки приложения. Случилось так, что я получаю два push-сообщения, хотя я ожидал, что он получит его только после того, как приложение уже изменит идентификатор регистрации.

Я ожидаю, что приложение может получить два или более дублированных приложения, если когда-либо я также обновил приложение, так как, как сказано в документации, идентификатор регистрации может измениться при обновлении.

Любое обходное решение, которое я могу сделать для обработки этих повторяющихся сообщений?

Solutions Collecting From Web of "Приложение получает дублирующее уведомление с использованием GCM после повторной установки"

Из официальной документации:

Как удаляется незарегистрированное приложение для клиента

Клиентское приложение может быть автоматически незарегистрировано после его удаления. Однако этот процесс не происходит немедленно. Что происходит в этом случае:

  1. Конечный пользователь удаляет клиентское приложение.
  2. Сервер приложений отправляет сообщение на сервер соединения GCM.
  3. Сервер соединения GCM отправляет сообщение клиенту GCM на устройстве.
  4. Клиент GCM на устройстве получает сообщение и обнаруживает, что клиентское приложение было удалено; Детали обнаружения зависят от платформы, на которой работает клиентское приложение.
  5. Клиент GCM на устройстве сообщает серверу подключения GCM, что клиентское приложение было удалено.
  6. Сервер соединения GCM отмечает маркер регистрации для удаления.
  7. Сервер приложений отправляет сообщение в GCM.
  8. GCM возвращает сообщение об ошибке NotRegistered на сервер приложений.
  9. Сервер приложений должен удалить токен регистрации.

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

Однако, по-видимому, может случиться так, что вы все равно получите уведомление по старому идентификатору регистрации, так как пользователи заявляют в других вопросах:

  • Android GCM и несколько токенов
  • Отмена регистрации и повторная регистрация сообщений GCM приводит к тому, что два регистратора будут действительны. Это так, как предполагалось?
  • Могут ли старые жетоны GCM жить даже после удаления?

Для этой проблемы существует функция, называемая «канонические идентификаторы»:

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

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

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

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

@KaHel Когда клиентское приложение было удалено, regId будет действительным в течение некоторого времени, вы правы. Но когда клиентское приложение будет установлено снова, и ваш push-сервер попытается отправить сообщение на старый reg id, сообщение будет успешно отправлено, но сервер GCM положил cannonical_id в ответ. И вы должны исправить этот ответ с помощью cannonical_id. Как это я описал на этом посту, и нет большой документации о cannonical_id . Т.е., как только вы получите cannonical_id с сервера GCM, вы должны немедленно заменить старый reg_id новым значением. Это позволит вам не создавать много регистров для одного клиента, только один к одному.

После восстановления вы получите новый RegId, а prev больше не действителен. Таким образом, даже если вы отправляете push в оба RegIds, только последний получит его.

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

Например, при входе пользователя в приложение вы отправляете свой GoogleId + RegId. После переустановки приложения и релогинга вы просто обновляете RegId на сервере. Таким образом, вы можете иметь только один RegId для каждого пользователя.

Существует проблема: только одно устройство получит push-сообщение (если вы входите в 2 устройства с одинаковой учетной записью). Таким образом, вы можете отправить сервер GoogleId + RegId + DeviceId после запуска приложения.