Почему я получаю несколько активных токенов для моего устройства с помощью службы Googles Cloud to Device Messaging? - PullRequest
7 голосов
/ 08 августа 2011

Я только что добавил функцию C2DM в свое приложение для Android.

В настоящий момент происходит следующее, если в моем приложении запущен C2DM.

  1. Мое приложение отправляет регистрацию Намерение
  2. Ответ получен моим приложением
  3. Токен устройства извлекается из намерения и отправляется на мой сервер

    С этого момента все работает нормально. Клиент получает push-уведомления и т. Д. Проблема возникает, если происходит следующее:

  4. Пользователь удаляет приложение, не отключая push. (Полностью удалив его не только обновляя)

  5. Пользователь переустанавливает приложение

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

Это приводит к следующей проблеме:

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

Это ошибка в системе C2DM или что-то не так в моей настройке?

Обновление

Я последовал совету Бердонса и сделал следующее:

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

Следующее обновление

Кажется, я не единственный с этой проблемой:

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

Я надеялся, что Google будет управлять этими токенами таким образом, что старые токены с того же устройства будут отключены после выпуска нового. Я также ожидаю, что после отправки незарегистрированной Intent все токены для этого приложения и этого устройства будут помечены как недействительные или навсегда удалены с сервера Google. Если это как-то дизайнерское решение Google для особых случаев использования, я не вижу, пожалуйста, просветите меня.

Ответы [ 3 ]

4 голосов
/ 18 августа 2011

Теперь мы нашли решение, которое должно работать в большинстве случаев.

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

  • Теперь устройство отображает уведомление, только если токен в сообщении и токен, сохраненный в файле pref, совпадают. Таким образом, мы гарантируем, что не будем показывать сообщения для токенов устройств, которые были получены при предыдущих установках.
  • Если токены не совпадают, мы нашли старый токен, который больше не должен быть активным. Теперь мы помечаем токен на нашем собственном веб-сервере как неактивный, чтобы сервер не отправлял больше ненужных сообщений C2D

Это решение позволяет нам показывать только релевантные данные без необходимости сохранять уникальный идентификатор пользователя.

3 голосов
/ 09 августа 2011

В моей реализации C2DM токен устройства каждого пользователя сохраняется в базе данных с указанием его UDID и имени пакета приложения (среди прочего).UDID и имя пакета образуют первичный ключ, что означает, что в таблице можно перечислить несколько приложений с одного устройства (UDID).Когда пользователь запускает определенное приложение, токен устройства записывается, и если он удаляет и повторно запускает приложение, новый токен устройства записывается поверх старого.У нас также есть столбцы, чтобы записать, активен ли push для этой конкретной комбинации приложения / устройства, и какие типы push-сообщений пользователь включил / отключил.

Когда приходит время отправлять push для определенного приложения,никакой UDID не будет зарегистрирован более одного раза (поскольку эти два поля образуют первичный ключ), и поэтому будет использоваться только самый последний маркер устройства.Кроме того, наш запрос возвращает только те строки, для которых включены push-сообщения.

Это решение должно решить вашу проблему, поскольку не позволяет отправлять push-сообщения на оба токена устройства.Надеюсь, это поможет!

1 голос
/ 08 августа 2011

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

Обновление
Вы могли бы провести различие между различными сообщениями C2DM, используя в качестве идентификатора коллапс_ключа (или что-либо другое, созданное вами). Обновите его между регистрациями и передайте на устройство после регистрации, отмены регистрации и сообщений.

...