Android C2DM: Дублировать сообщение на одно и то же устройство и приложение

Мне интересно, сталкивался ли кто-нибудь с этой проблемой с Google C2DM ? Это сценарий, с которым я столкнулся:

  1. Пользователь устанавливает приложение и регистрирует сервер C2DM для регистрационного ключа.
  2. Пользователь удаляет приложение.
  3. Пользователь переустанавливает приложение (и регистрируется с сервером C2DM для нового регистрационного ключа).

Теперь я отправляю сообщение с моего сервера на телефон пользователя, и они получают дублирующее сообщение.

Может ли кто-нибудь пролить хоть какое-то представление о том, что это ожидаемое поведение или как я могу это исправить? Благодаря,

Не уверен, что это лучший подход, но есть соответствующая тема в группе android-c2dm , где плакат предлагает одну технику:

Я отправляю идентификатор регистрации в сообщении, поэтому я могу проверить его на сохраненный идентификатор регистрации на устройстве.

Если это не то же самое, отбросьте его и сообщите службе, что идентификатор регистрации больше не используется

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

Это должно произойти только для первого push-уведомления после повторной установки вашего приложения.

Служба Google C2DM работает в пассивном режиме, когда дело доходит до обнаружения удаленных приложений.

Первое push-уведомление после удаления вашего приложения (без регистрации с C2DM !!!) НЕ вернет никакой ошибке в ответ. Однако второе push-уведомление вернет коды ошибок «недействительной регистрации» или «незарегистрированные», где вы можете понять, что приложение было удалено.

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

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

Да, я столкнулся с той же проблемой, и, на мой взгляд, это большой надзор в реализации Android C2DM. IOS справляется с этим гораздо лучше, поскольку приложение может получать только уведомления только для одного и только одного токена устройства (эквивалент идентификатора регистрации c2dm)

Обходной путь, который я использую, состоит в том, чтобы отправить последние 10 символов идентификатора регистрации как часть полезной нагрузки c2dm, а затем в мой метод onMessage. Я выполняю следующую проверку:

if (!regId.endsWith(bundle.getString("regsuffix"))) return null; 

И ответы @Zamel и @johan хорошие, и их нужно комбинировать. Если вы объедините оба решения, вы минимизируете базу данных своего сервера.

Поэтому лучшим решением будет:

  1. Отправлять идентификатор устройства при отправке маркера push на сервер

  2. Обновить токеновый токен при отправке для существующего идентификатора устройства

  3. Недействительный токен-токен в базе данных сервера, если push-уведомление возвращает на сервер коды ошибок «неправильной регистрации» или «незарегистрированные»

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

Intereting Posts
Ошибка: выполнение выполнено для задачи ': android: transformClassesAndResourcesWithProguardForRelease' Исключение NullPointerException при добавлении / удалении просмотров RelativeLayout (анимации) Как вы можете получить список непризнанных полей JSON в Gson, таких как @JsonAnySetter от Jackson? Как разблокировать экран при вызове BroadcastReceiver? Android-тесты – Как добавить журналы Espresso Странная запись в журнале, связанная с webcoreglue в android Android.net.wifi.STATE_CHANGE: не срабатывает при отключении Wi-Fi Android Lollipop становится администратором устройства не работает Сбой приложения с версией Android 4.0 или более поздней версии AppBarLayout.setExpanded (логическая, истинная) странная анимация в библиотеке поддержки 23.1.1 Проблема API клиента Джерси Андроидный указатель входа без использования webview Использование LogCat на JellyBean Как запустить новый класс активности во всплывающем окне AlertDialog, нажав кнопку ok Как автоматически запустить процесс установки android apk, когда пользователь нажимает ссылку для загрузки на веб-сайте