onNewToken
. О чем говорится в документации:
Вызывается, когда создается новый токен для проекта Firebase по умолчанию.
Вызывается после установки приложения, когда токен создается впервые, и снова, если токен
Это означает, что после того, как токен был сгенерирован, этот метод не будет вызываться до тех пор, пока не изменится токен pu sh.
Когда ваше приложение запустит вас должен получить экземпляр FirebaseInstanceId
и извлечь из него токен. Это гарантирует, что вы получите действительный токен.
Вы должны оставить код в своем методе onNewToken
как есть и добавить код, упомянутый ниже, для обработки случаев, когда токен уже сгенерирован:
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult: InstanceIdResult ->
val currentUser = FirebaseAuth.getInstance().currentUser?.uid
if(currentUser != null){
FirebaseFirestore.getInstance().collection("user").document(currentUser).update("deviceToken", instanceIdResult.token)
}
}
Обновление: когда его использовать.
Во-первых, вы должны понять две вещи:
onNewToken
вызывается, когда токен отсутствует и должно быть сгенерировано (после установки приложения) ИЛИ, когда срок действия токена истек и его необходимо заменить . FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(...)
НЕ генерирует никаких токенов! Он возвращает только вам доступный в настоящее время, действительный , безопасный для использования токен уведомления pu sh. В вашем случае нет смысла вызывать его несколько раз.
Итак, теперь у вас есть onNewToken
, и он готов к обработке изменений токенов. Хорошо. Оставьте как есть.
Теперь вам нужно обработать случай, когда токен уже сгенерирован, действителен и готов к использованию. onNewToken
в этом случае не вызывается! Теперь ваша очередь вручную запросить возврат этого токена.
Пример:
class YourActivity: Activity {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
uploadFcmToken()
}
private fun uploadFcmToken() {
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult: InstanceIdResult ->
val currentUser = FirebaseAuth.getInstance().currentUser?.uid
if(currentUser != null){
FirebaseFirestore.getInstance()
.collection("user")
.document(currentUser)
.update("deviceToken", instanceIdResult.token)
}
}
}
}