Firebase onNewToken не обновляет мой токен - PullRequest
0 голосов
/ 03 августа 2020

Итак, мне нужно обновлять sh мой токен каждый раз, когда он истекает, но служба, запущенная за d, не запускается onNewToken()

Манифест

 <service
            android:name=".fcm.MyFirebaseMessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

Код

class MyFirebaseMessagingService: FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        super.onNewToken(token)
        val currentUser = FirebaseAuth.getInstance().currentUser?.uid
        if(currentUser != null){
            FirebaseFirestore.getInstance().collection("user").document(currentUser).update("deviceToken",token)
        }
    }
}

Нужно ли мне явно вызывать getInstanceID() каждый раз, когда я go через onStart () в своем приложении? или эта служба должна обновить мой deviceToken новым, как это сделал я?

Я тестировал его со старой зарегистрированной учетной записью, но уведомления не приходили, следовательно, новый токен не был обновлен (мне нужно было выйдите из системы и войдите снова, чтобы получать уведомления еще раз)

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Скорее всего, вы добавили onNewToken реализацию после того, как FCM уже сгенерировал начальный токен.

Для этого конкретного случая c (который в основном влияет на вас как на разработчика, но не ваши пользователи), вы также захотите получить токен в чем-то вроде onStart вашего основного действия. В качестве альтернативы вы можете удалить приложение и переустановить его после добавления onNewToken в первый раз, и в этом случае оно также сгенерирует новый токен и вызовет onNewToken.

Таким образом, вы обычно получаете токен как в onNewToken, так и в onStart вашего приложения.

1 голос
/ 03 августа 2020

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)
            }
        }
    }
}
...