Я переношу свое приложение с GCM на FCM.
Когда новый пользователь устанавливает мое приложение, onTokenRefresh()
автоматически вызывается. Проблема в том, что пользователь еще не вошел в систему (нет идентификатора пользователя).
Как я могу активировать onTokenRefresh()
после входа пользователя в систему?
android
firebase-cloud-messaging
ТареК Хури
источник
источник
Ответы:
onTokenRefresh()
Метод будет вызываться всякий раз , когда новый маркер генерируется. После установки приложения оно будет создано немедленно (как вы выяснили). Он также будет вызываться при изменении токена.По словам
FirebaseCloudMessaging
гида:Это означает, что регистрация токена производится для каждого приложения. Похоже, вы хотите использовать токен после того, как пользователь вошел в систему. Я бы посоветовал вам сохранить токен в
onTokenRefresh()
методе во внутреннем хранилище или общих настройках. Затем извлеките токен из хранилища после того, как пользователь войдет в систему, и при необходимости зарегистрируйте токен на своем сервере.Если вы хотите вручную принудительно
onTokenRefresh()
запустить, вы можете создать IntentService и удалить экземпляр токена. Затем, когда вы вызовете getToken,onTokenRefresh()
метод будет вызван снова.Пример кода:
РЕДАКТИРОВАТЬ
onTokenRefresh () устарел . Использование
onNewToken()
вMyFirebaseMessagingService
источник
Попробуйте реализовать,
FirebaseInstanceIdService
чтобы получить токен обновления.Доступ к токену регистрации:
Вы можете получить доступ к значению токена, расширив FirebaseInstanceIdService . Убедитесь, что вы добавили службу в свой манифест , затем вызовите
getToken
в контекстеonTokenRefresh
и зарегистрируйте значение, как показано:Полный код:
Смотрите мой ответ здесь .
РЕДАКТИРОВАТЬ:
Вам не следует запускать FirebaseInstanceIdService самостоятельно.
Он не будет вызываться очень часто, он необходим для ротации ключей и обработки изменений идентификатора экземпляра из-за:
Система будет регулировать событие обновления на всех устройствах, чтобы избежать перегрузки серверов приложений обновлениями токенов.
Попробуйте следующий способ :
источник
onTokenRefresh()
вызываться?Я поддерживаю один флаг в общих настройках, который указывает, отправлен ли токен gcm на сервер или нет. На экране-заставке я каждый раз вызываю один метод sendDevicetokenToServer. Этот метод проверяет, не является ли идентификатор пользователя пустым, и статус отправки gcm, а затем отправляет токен на сервер.
}
В классе MyFirebaseInstanceIDService
источник
Ребята, у него очень простое решение
https://developers.google.com/instance-id/guides/android-implementation#generate_a_token
Примечание. Если ваше приложение использовало токены, которые были удалены с помощью deleteInstanceID, вашему приложению потребуется сгенерировать заменяющие токены.
Вместо удаления идентификатора экземпляра удалите только токен:
источник
Это в RxJava2 в сценарии, когда один пользователь выходит из вашего приложения, а другие пользователи входят в систему (одно и то же приложение) Для повторной регистрации и вызова входа (если на устройстве пользователя не было подключения к Интернету ранее во время начала активности, и нам нужно отправить токен в логин api)
Авторизоваться
источник
Этот ответ не уничтожает идентификатор экземпляра, вместо этого он может получить текущий. Он также сохраняет обновленный вариант в общих настройках.
Strings.xml
Utility.java (любой класс, в котором вы хотите установить / получить настройки)
MyFirebaseInstanceIdService.java (расширяет FirebaseInstanceIdService)
}
onCreate
Служба Android 2.0 и выше не запускается при автоматическом запуске ( источник ). Вместо этогоonStartCommand
переопределяется и используется. Но в реальной FirebaseInstanceIdService он объявлен как final и не может быть отменен. Однако, когда мы запускаем службу с помощью startService (), если служба уже запущена, используется ее исходный экземпляр. (что хорошо). Наш onCreate () (определенный выше) также был вызван !.Используйте это в начале MainActivity или в любой другой момент, когда вам нужен идентификатор экземпляра.
И наконец,
Обратите внимание : вы можете еще больше улучшить это, пытаясь переместить код startservice () в метод getFirebaseInstanceId.
источник
источник
Новый способ сделать это - переопределить
onNewToken
метод изFirebaseMessagingService
Также не забудьте добавить службу в Manifest.xml
источник
Как я обновляю свой deviceToken
Сначала, когда я вхожу в систему, я отправляю первый токен устройства в коллекции пользователей и текущего пользователя, вошедшего в систему.
После этого я просто переопределяю
onNewToken(token:String)
в своемFirebaseMessagingService()
и просто обновляю это значение, если для этого пользователя создается новый токен.Каждый раз, когда ваше приложение открывается, оно будет проверять наличие нового токена, если пользователь еще не вошел в систему, он не будет обновлять токен, если пользователь уже вошел в систему, вы можете проверить наличие
newToken
источник