Я хотел бы знать, как правильно получить токен Firebase для отправки push-уведомления теперь, когда getToken () устарел.
быстрый доступ с помощью FirebaseInstanceId.getInstance (). getId ();
ОБНОВЛЕННЫЙ ОТВЕТ
FirebaseInstanceId устарел, но теперь вы можете использовать FirebaseInstallations.getInstance (). GetToken () или Токен FirebaseMessaging.getInstance ()..
Например:
FirebaseInstallations.getInstance().getToken(true).addOnCompleteListener {
fbToken = it.result!!.token
// DO your thing with your firebase token
}
Или другой вариант:
FirebaseMessaging.getInstance().token.addOnCompleteListener {
if (it.isComplete){
fbToken = it.result.toString()
// DO your thing with your firebase token
}
}
СТАРЫЙ ОТВЕТ
Как говорит документация:
This method was deprecated. In favour of getInstanceId().
getInstanceId () вернет Задачу с InstanceIdResult. Как это:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String deviceToken = instanceIdResult.getToken();
// Do whatever you want with your token now
// i.e. store it on SharedPreferences or DB
// or directly send it to server
}
});
Хотя это правда, что этот подход буквально заменит использование FirebaseInstanceId.getInstanceId (). GetToken (), он не решает того факта, что FirebaseInstanceIdService также устарел, оставляя нам другой вопрос: где его использовать? Его можно использовать в любом контексте Activity, чтобы он всегда возвращал токен. Но что, если мы хотим получить токен только при создании и когда он редко обновляется? Для этого вы должны переопределить новый метод onNewToken из нашей старой реализации FirebaseMessagingService: (Да, «Обмен сообщениями», а не «InstanceId»)
@Override
public void onNewToken(String s) {
super.onNewToken(s);
String deviceToken = s;
// Do whatever you want with your token now
// i.e. store it on SharedPreferences or DB
// or directly send it to server
}
Таким образом, код останется более компактным и даже не потребуется использовать первый подход.
Я использую это во фрагменте, и он показывает, что на нестатический метод getInstanceId () нельзя ссылаться из статического контекста.
Извините моя ошибка. Я отредактировал ответ на вызов getInstance, так как getInstanceId является методом экземпляра.
@jantoo вы пробовали отредактированный ответ?
@BhaskarJyotiDutta Ты сделал это !. Также, пожалуйста, одобрите правку, которую я предложил, чтобы использовать правильный способ и грамматику для запроса в Stack Overflow.
Прости я не понял. Я плохо говорю по-английски? (Извините, если я допустил ошибку)
Обратный вызов onSuccess вводится только один раз, в первый раз. Если вы хотите получить Токен, который приложение уже зарегистрировало во второй раз? Я пытаюсь найти способ потребовать его, не сохраняя в настройках приложения
@ phemt.latd Я не понял вашего вопроса.
@Facundo, извините, если вы используете новый async listener для получения токена, в первый раз, когда приложение получит его, в следующий раз, когда приложение не запустит обратный вызов, потому что токен уже сгенерирован. Есть ли способ получить уже сгенерированный токен, или вы должны сохранить его в SharedPreferences при срабатывании обратного вызова успеха?
@ phemt.latd этот код всегда возвращает токен, а не только в первый раз. Он будет выполнен только при обновлении токена, если вы поместите этот код в метод onTokenRefresh. если вы хотите получать токен при каждом запуске приложения, вы можете включить этот код в свой метод MainActivity.onCreate.
Зачем пропускать context, если на самом деле можно обойтись без него? !!
@HamzehSoboh Я редактировал, как и в случае с InstanceIdResult, возможно, в этом нет необходимости, но чтобы ответить на ваш вопрос, взгляните на этот ссылка на сайт о слушатели с ограниченным объемом активности.
@Facundo, до того как был введен onNewToken, onTokenRefresh должен был вызывать всякий раз, когда система аннулирует токены. Такое же поведение для onNewToken? Будет ли вызываться onNewToken, когда мои существующие токены необходимо обновить или когда система сделает недействительными любые существующие токены?
@ Эй, ты хороший вопрос. Я не нашел никакой документации, описывающей такое поведение. Пойду еще немного по этому поводу.
В документации @Facundo говорится: «Вызывается, когда создается новый токен для проекта Firebase по умолчанию. Он вызывается после установки приложения, когда токен создается впервые, и снова, если токен изменяется». Интересная часть - «снова, если токен изменится», означает ли это, что он также будет вызываться, когда система определит, что токен необходимо обновить?
@ Привет, ты уверен, он вызывается каждый раз, когда токен обновляется.
Это не решение, когда вам нужен токен вне обратного вызова. Это не работает.
@PedroPauloAmorim Я согласен. newToken, похоже, не вызывается на 100%, поэтому требуется другой метод для получения существующего токена
@behelit Мое решение состояло в том, чтобы продолжать попытки получить его, пока система не вернет действительное значение (также известное как рекурсивное).
Есть ли проблема, если я добавлю FirebaseInstanceId.getInstance (). GetInstanceId (). AddOnSucces sListener (...) в средство запуска действий onCreate (), поэтому он будет вызываться все время, когда пользователь открывает мое приложение?
@CarlosEduardoKiLee, проблем быть не должно. Это может быть не лучшей практикой, поскольку он будет возвращать то же значение, пока токен не будет обновлен.
это снова устарело
FirebaseInstallations.getInstance (). GetToken (true) НЕ ВЫДАЕТ ЖЕТОН СООБЩЕНИЙ, ОН МЕНЯЕТСЯ ПОСЛЕ КАЖДОГО ЗАПУСКА
FirebaseInstanceIdService устарел.!
просто переопределите onNewToken() в FirebaseMessagingService
public class LatestFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(String mToken) {
super.onNewToken(mToken);
Log.e("TOKEN",mToken);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
}}
InAndroidManifest.xml
<service
android:name = ".LatestFirebaseMessagingService"
android:stopWithTask = "false">
<intent-filter>
<action android:name = "com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
getToken() Это тоже устарело.!
если вам нужно получить токен в своей деятельности, используйте приведенный ниже код.
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String mToken = instanceIdResult.getToken();
Log.e("Token",mToken);
}
});
И теперь FirebaseInstanceId устарел, ура
Вы нашли какое-нибудь решение @mliu?
FirebaseMessaging.getInstance (). GetToken () - это новый способ .... источник: firebase.google.com/docs/cloud-messaging/android/…
таким образом, это устарело ..
примечание: если вы не получаете onNewToken так часто, как вы думаете, это проблематично, если у вас есть многопользовательская поддержка
Простой stackoverflow.com/a/52120871/6891563