Надеюсь, все вы знаете об этом классе, который используется для получения токена уведомления всякий раз, когда токен уведомления firebase обновляется, мы получаем обновленный токен из этого класса, из следующего метода.
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
Чтобы использовать это, поскольку я хочу реализовать FCM, я расширил MyClass из FirebaseInstanceIdService
Но, показывая, что FirebaseInstanceIdService устарел
Кто-нибудь знает об этом ?, Какой метод или класс я должен использовать вместо этого, чтобы получить обновленный токен, поскольку он устарел.
Я использую: implementation 'com.google.firebase:firebase-messaging:17.1.0'
Я проверил документ на то, что об этом ничего не сказано. : ДОКУМЕНТ НАСТРОЙКИ FCM
ОБНОВИТЬ
Эта проблема исправлена.
Поскольку Google отказался от FirebaseInstanceService,
Я задал вопрос, чтобы найти способ, и я узнал, что мы можем получить токен от FirebaseMessagingService,
Как и раньше, когда я задал вопрос, документы не были обновлены, но теперь обновлены документы Google, поэтому для получения дополнительной информации обратитесь к этому документу Google: FirebaseMessagingService
СТАРЫЙ От: FirebaseInstanceService (устарело)
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
НОВОЕ От: FirebaseMessagingService
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.d("NEW_TOKEN",s);
}
Спасибо.
Здесь также: medium.com/android-school/…
онлайн-документация только что обновлена. firebase.google.com/docs/reference/android/com/google/fireba se /…
Обязательно / правильно звонить super.onNewToken(s);? (Я не вижу, чтобы его вызывали на firebase.google.com/docs/cloud-messaging/android/client.)
Будут ли изменения в манифесте?
Вам просто не нужно определять FirebaseInstanceService в манифесте, поскольку он устарел.
Спасибо за это. Android Studio необходимо обновить инструкции в мастере настройки Firebase.
Огнебазер здесь
Проверьте справочная документация для FirebaseInstanceIdService:
This class was deprecated.
In favour of overriding
onNewTokeninFirebaseMessagingService. Once that has been implemented, this service can be safely removed.
Как ни странно, JavaDoc для FirebaseMessagingService еще не упоминает метод onNewToken. Похоже, что еще не вся обновленная документация опубликована. Я зарегистрировал внутреннюю проблему, чтобы получить обновления опубликованных справочных документов, а также обновить образцы в руководстве.
Тем временем должны работать как старые / устаревшие вызовы, так и новые. Если у вас возникнут проблемы, опубликуйте код, и я посмотрю.
Документы Firebase тоже еще не обновлялись.
Да, @frank, метод существует, но соответствующие документы еще не обновлены.
@kev Это похоже на (действительный) новый вопрос. Пожалуйста, создайте новое сообщение с минимальным полным фрагментом кода.
@FrankvanPuffelen уже сделал. Взглянуть. stackoverflow.com/questions/51296171/…
Об этом обновлении я узнал и для Xamarin Android. Добавлен метод OnNewToken в класс, расширяющий FirebaseMessagingService. Но этот метод не попал. Я не могу понять, что мне делать. Это другое в файле манифеста Android для xamarin.
Обновление 11-12-2020
Теперь FirebaseInstanceId также удален
Теперь нам нужно использовать FirebaseMessaging.getInstance().token
ОБРАЗЕЦ КОДА
FirebaseMessaging.getInstance().token.addOnCompleteListener {
if (it.isComplete){
firebaseToken = it.result.toString()
Util.printLog(firebaseToken)
}
}
даFirebaseInstanceIdService не рекомендуется
FROM DOCS :- This class was deprecated. In favour of
overriding onNewTokeninFirebaseMessagingService. Once that has been implemented, this service can be safely removed.
Нет необходимости использовать службу FirebaseInstanceIdService для получения токена FCM. Вы можете безопасно удалить службу FirebaseInstanceIdService.
Теперь нам нужно @Override onNewToken получить Token в FirebaseMessagingService
ОБРАЗЕЦ КОДА
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(String s) {
Log.e("NEW_TOKEN", s);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> params = remoteMessage.getData();
JSONObject object = new JSONObject(params);
Log.e("JSON_OBJECT", object.toString());
String NOTIFICATION_CHANNEL_ID = "Nilesh_channel";
long pattern[] = {0, 1000, 500, 1000};
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications",
NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setDescription("");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setVibrationPattern(pattern);
notificationChannel.enableVibration(true);
mNotificationManager.createNotificationChannel(notificationChannel);
}
// to diaplay notification in DND Mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = mNotificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
channel.canBypassDnd();
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
notificationBuilder.setAutoCancel(true)
.setColor(ContextCompat.getColor(this, R.color.colorAccent))
.setContentTitle(getString(R.string.app_name))
.setContentText(remoteMessage.getNotification().getBody())
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher_background)
.setAutoCancel(true);
mNotificationManager.notify(1000, notificationBuilder.build());
}
}
# РЕДАКТИРОВАТЬ
You need to register your
FirebaseMessagingServicein manifest file like this
<service
android:name = ".MyFirebaseMessagingService"
android:stopWithTask = "false">
<intent-filter>
<action android:name = "com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
# как получить токен в своей деятельности
.getToken();is also deprecated if you need to get token in your activity than UsegetInstanceId ()
Теперь нам нужно использовать getInstanceId () для генерации токена.
getInstanceId () Возвращает ID и автоматически сгенерированный токен для этого проекта Firebase.
Это генерирует идентификатор экземпляра, если он еще не существует, который начинает периодически отправлять информацию в серверную часть Firebase.
Возврат
InstanceIdResult, который содержит ID и token.ОБРАЗЕЦ КОДА
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String newToken = instanceIdResult.getToken();
Log.e("newToken",newToken);
}
});
## РЕДАКТИРОВАТЬ 2
Вот рабочий код для котлина
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(p0: String?) {
}
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val NOTIFICATION_CHANNEL_ID = "Nilesh_channel"
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications", NotificationManager.IMPORTANCE_HIGH)
notificationChannel.description = "Description"
notificationChannel.enableLights(true)
notificationChannel.lightColor = Color.RED
notificationChannel.vibrationPattern = longArrayOf(0, 1000, 500, 1000)
notificationChannel.enableVibration(true)
notificationManager.createNotificationChannel(notificationChannel)
}
// to diaplay notification in DND Mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
channel.canBypassDnd()
}
val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
notificationBuilder.setAutoCancel(true)
.setColor(ContextCompat.getColor(this, R.color.colorAccent))
.setContentTitle(getString(R.string.app_name))
.setContentText(remoteMessage!!.getNotification()!!.getBody())
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher_background)
.setAutoCancel(true)
notificationManager.notify(1000, notificationBuilder.build())
}
}
Комментарии не подлежат расширенному обсуждению; этот разговор был переехал в чат.
почему никто не показывает, как импортировать FirebaseMessagingService?
привет, что я должен использовать FirebaseInstallations или FirebaseMessaging?
@Tony сейчас использую FirebaseMessaging.getInstance()
этот ответ должен быть принят, чтобы помочь другим найти устаревшую проблему. многие статьи все еще используют FirebaseInstanceId для получения нового токена FCM. Надеюсь, другие прочитают мой комментарий
И это:
FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()
Предположим, что это решение устаревшего:
FirebaseInstanceId.getInstance().getToken()
РЕДАКТИРОВАТЬ
FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()
может вызвать исключение, если задача еще не завершена, поэтому метод, описанный Нилешем Ратодом (с .addOnSuccessListener), является правильным способом сделать это.
Котлин:
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
val newToken = instanceIdResult.token
Log.e("newToken", newToken)
}
В КОТЛИНЕ: - Если вы хотите сохранить Токен в базе данных или общих предпочтениях, переопределите onNewToken в FirebaseMessagingService
override fun onNewToken(token: String) {
super.onNewToken(token)
}
Получите токен во время выполнения, используйте
FirebaseInstanceId.getInstance().instanceId
.addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
val mToken = instanceIdResult.token
println("printing fcm token: $mToken")
}
Теперь это override fun onNewToken(token: String) (без вопросительного знака).
Kotlin позволяет использовать еще более простой код, чем то, что показано в других ответах.
Чтобы получать новый токен всякий раз, когда он обновляется:
class MyFirebaseMessagingService: FirebaseMessagingService() {
override fun onNewToken(token: String?) {
Log.d("FMS_TOKEN", token)
}
...
}
Чтобы получить токен из любого места во время выполнения:
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
Log.d("FMS_TOKEN", it.token)
}
FirebaseinstanceIdService устарел.
Поэтому нужно использовать FirebaseMessagingService
Сверните изображение, пожалуйста:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.e("NEW_TOKEN",s);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
}
}
Класс реализации FCM:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
if (data != null) {
// Do something with Token
}
}
}
// FirebaseInstanceId.getInstance().getToken();
@Override
public void onNewToken(String token) {
super.onNewToken(token);
if (!token.isEmpty()) {
Log.e("NEW_TOKEN",token);
}
}
}
И вызовите его инициализацию в Activity или APP:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
instanceIdResult -> {
String newToken = instanceIdResult.getToken();
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.i("FireBaseToken", "onFailure : " + e.toString());
}
});
AndroidManifest.xml:
<service android:name = "ir.hamplus.MyFirebaseMessagingService"
android:stopWithTask = "false">
<intent-filter>
<action android:name = "com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
** Если вы добавили «INSTANCE_ID_EVENT», не забудьте отключить его.
Вы должны использовать FirebaseMessagingService() вместо FirebaseInstanceIdService
Просто добавьте это в build.gradle. реализация 'com.google.firebase: firebase-messaging: 20.2.3'
Просто вызовите этот метод, чтобы получить токен обмена сообщениями Firebase.
public void getFirebaseMessagingToken ( ) {
FirebaseMessaging.getInstance ().getToken ()
.addOnCompleteListener ( task -> {
if (!task.isSuccessful ()) {
//Could not get FirebaseMessagingToken
return;
}
if (null != task.getResult ()) {
//Got FirebaseMessagingToken
String firebaseMessagingToken = Objects.requireNonNull ( task.getResult () );
//Use firebaseMessagingToken further
}
} );
}
Приведенный выше код хорошо работает после добавления этой зависимости в файл build.gradle.
implementation 'com.google.firebase:firebase-messaging:21.1.0'
Примечание: Это модификация кода, сделанная для вышеуказанной зависимости для устранения устаревания. (Рабочий код от 9 мая 2021 г.)
привет, что я должен использовать FirebaseInstallations или FirebaseMessaging?
Привет @Tony! Для отправки облачного сообщения через firebase необходимо использовать firebase-messaging. Похоже, что firebase-installation не предоставляет полный токен, необходимый для отправки облачного сообщения на другие устройства. Поправьте меня, если я ошибаюсь. TIA!
Вместо этого используйте FirebaseMessaging
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "Fetching FCM registration token failed", task.getException());
return;
}
// Get new FCM registration token
String token = task.getResult();
// Log and toast
String msg = getString(R.string.msg_token_fmt, token);
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
Для котлина я использую следующие
val fcmtoken = FirebaseMessaging.getInstance().token.await()
а для функций расширения
public suspend fun <T> Task<T>.await(): T {
// fast path
if (isComplete) {
val e = exception
return if (e == null) {
if (isCanceled) {
throw CancellationException("Task $this was cancelled normally.")
} else {
@Suppress("UNCHECKED_CAST")
result as T
}
} else {
throw e
}
}
return suspendCancellableCoroutine { cont ->
addOnCompleteListener {
val e = exception
if (e == null) {
@Suppress("UNCHECKED_CAST")
if (isCanceled) cont.cancel() else cont.resume(result as T)
} else {
cont.resumeWithException(e)
}
}
}
}
Task<T>.await() доступен из github.com/Kotlin/kotlinx.coroutines/tree/master/integration /…, поэтому просто добавьте implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.4.2' в свой gradle
getInstance().getInstanceId() также устарел, и сейчас используется FirebaseMessaging.
FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (task.isSuccessful) {
val token = task.result
} else {
Timber.e(task.exception)
}
}
Что делает forceRefresh? обновлять токен при открытии активности?
@AbhishekAN да, это заставит его получить новый токун.
привет, что я должен использовать FirebaseInstallations или FirebaseMessaging?
@Tony Проверьте обновленный ответ.
И вот решение для C# / Xamarin.Android:
var token = await FirebaseInstallations.Instance.GetToken(forceRefresh: false).AsAsync<InstallationTokenResult>();
Первый импорт import com.google.firebase.messaging.FirebaseMessaging;
тогда
Просто используйте FirebaseMessaging.getInstance().getToken().getResult(); вместо FirebaseInstanceId.getInstance().getToken().getresult()
Вот и все.
Размещено на GitHub