2013-07-22 2 views
4

Для приложения, которое я работаю, мне необходимо интегрировать облачные сообщения Google. Поиграв немного с разными примерами, я смог отправить и получить уведомление по моему поводу.
Однако я столкнулся с интересной ситуацией. Как я знаю (пожалуйста, поправьте меня, если я ошибаюсь), registration_id выдается на устройство и на приложение.GCM: отправлять уведомления только для текущего пользователя, зарегистрированного в приложении

Приложение, в котором я работаю, поддерживает функцию входа в систему. Когда приложение установлено, и пользователь входит в систему в первый раз (пусть это будет «UserA»), я запрашиваю register_id из GCM, который затем я отправляю на свой сервер.

Теперь представьте, что UserA выходит из системы и предоставляет свое устройство некоторому UserB для входа. Другими словами, UserB регистрируется с использованием устройства UserA.

Проблема в том, что если между тем UserA получает уведомление, UserB сможет перехватить его. И если UserB получит уведомление, он не сможет его получить.
Это кажется нормальным, потому что registration_id относится к устройству и к приложению, но для моего случая это не кажется разумным.

Так что я спрашиваю, есть ли способ, с помощью которого registration_id может зависеть от некоторого идентификатора пользователя (помимо устройства и приложения)? Или как я могу сделать так, чтобы зарегистрированный пользователь получал только свои собственные уведомления?

+0

Возможный дубликат [GCM с системой входа] (http://stackoverflow.com/questions/15946586/gcm-with-login-system) – Eran

ответ

4

Да, это правда, что у вас есть один идентификатор регистрации google для приложения на устройство.

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

Определите некоторые интерфейсы для вашего сервера, такие как registerOnServer и unRegisteronServer, отправьте уникальное значение для каждого пользователя в этом интерфейсе.

Итак, в вашем случае, когда A использует Log ins, регистрация сначала выполняется на GCM и регистрирует пользователя на вашем сервере с помощью интерфейса registerOnServer, и в то время как пользователь регистрирует отправленные уведомления, относящиеся к нему, к GCM для отправки Устройство.

Когда A выйдет из системы, отмените регистрацию его с помощью unRegisterServer и не отправляйте никаких сообщений с вашего сервера на GCM, поскольку A не зарегистрирован.

Итак, теперь, если B регистрируется даже на том же устройстве, зарегистрируйте его на своем сервере и отправьте его сообщения.

Это решит вашу проблему!

+0

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

+2

Вы не можете получать уведомления, если нет подключения к Интернету, поэтому в вашем приложении есть широковещательный приемник, который прослушивает состояние Интернета и доступен интернет-доступ, проверьте, вышел ли пользователь и отменил его регистрацию с сервера. – Nargis

+0

Хорошая идея, но, пожалуйста, что произойдет в сценарии, когда пользователь B зарегистрирован на начальном устройстве и теперь входит в другое устройство, какое устройство теперь должно получать уведомление. –