Определить, когда новый токен FCM генерируется извне службы - PullRequest
1 голос
/ 08 января 2020

Мне нужно очистить маркер пожарной базы, когда пользователь выйдет из системы, и нужно помешать ему получать уведомления pu sh из бэкэнда.
То, что я до сих пор делал, это
Я создал базу огня и я контролирую автоматическое создание токенов c с помощью следующего кода
В манифесте,

<!-- FCM: Disable auto-init -->
    <meta-data android:name="firebase_messaging_auto_init_enabled"
        android:value="false" />
    <meta-data android:name="firebase_analytics_collection_enabled"
        android:value="false" />

В процессе выхода из системы,

 Thread {
         try {
           FirebaseInstanceId.getInstance().deleteInstanceId()
           FirebaseMessaging.getInstance().isAutoInitEnabled = true
           FirebaseMessaging.getInstance().isAutoInitEnabled = false
         } catch (e: IOException) {
           e.printStackTrace()
         }
       }.start()


и я получаю новый токен в разделе «Активность при входе в систему» ​​с помощью кода ниже:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
            devicePushToken = it.token
            sharedPreferences.setValue(Constant.FCM_PUSH, devicePushToken)
            Log.e(TAG + '2', it?.token.toString())
        }


Но проблема в том, что он возвращает удаленный старый токен FCM. Новое поколение токенов занимает некоторое время. Он генерируется правильно в методе OnNewToken службы, но я не смог найти способ получить новый токен с помощью обратного вызова из службы в активность входа в систему. А также если я подожду некоторое время и запросю снова, используя описанное выше (FirebaseInstanceId.getInstance () .instanceId.addOnSuccessListener) Метод Возвращает правильный токен

1 Ответ

1 голос
/ 17 января 2020

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

Я использовал rx Java, наблюдаемый для достижения этой цели. Сначала , вам нужно добавить наблюдаемое в службу firebase

companion object{
    private var tokenData: PublishSubject<String> = PublishSubject.create()

    fun getObservable(): PublishSubject<String> {
        return tokenData
    }
}

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

override fun onNewToken(token: String) {
    super.onNewToken(token)
    tokenData.onNext(token)
}

Тогда вы можете получить вновь сгенерированный токен, как только он сгенерирован следующим методом,

val tokenObservable: Observable<String> =PushNotificationService.getObservable()    
val tokenSubscriber = object: io.reactivex.Observer<String> {
            override fun onNext(token: String) {
                println("**********$token")
                sharedPreferences.setValue(Constant.FCM_PUSH, token)
                activity?.setResult(RequestCodes.RESULT_NAV_LOGOUT).also {
                    activity?.finish()
                }
                hideProgress()//Display a progressbar so that user can wait untill new token is generated and hide it here on success

            }

            override fun onComplete() {
                println("onComplete")

            }

            override fun onError(e: Throwable) {
                e.printStackTrace()
                activity?.setResult(RequestCodes.RESULT_NAV_LOGOUT).also {
                    activity?.finish()
                }
                hideProgress()
            }

            override fun onSubscribe(s: Disposable) {
                println("onSubscribe")
            }
        }

        tokenObservable.subscribe(tokenSubscriber)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...