FirebaseInstanceIdService устарел

Надеюсь, все вы знаете об этом классе, который используется для получения токена уведомления всякий раз, когда токен уведомления 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);
}

Спасибо.

Размещено на GitHub

Rosário Pereira Fernandes 02.07.2018 02:46

Здесь также: medium.com/android-school/…

Pratik Butani 05.07.2018 13:02

онлайн-документация только что обновлена. firebase.google.com/docs/reference/android/com/google/fireba‌ se /…

jackycflau 10.07.2018 04:39

Обязательно / правильно звонить super.onNewToken(s);? (Я не вижу, чтобы его вызывали на firebase.google.com/docs/cloud-messaging/android/client.)

ban-geoengineering 18.08.2018 18:47

Будут ли изменения в манифесте?

Muahmmad Tayyib 04.12.2018 17:00

Вам просто не нужно определять FirebaseInstanceService в манифесте, поскольку он устарел.

Uttam Panchasara 05.12.2018 05:47

Спасибо за это. Android Studio необходимо обновить инструкции в мастере настройки Firebase.

John Gorenfeld 02.04.2020 11:07
256
7
133 861
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Ответ принят как подходящий

Огнебазер здесь

Проверьте справочная документация для FirebaseInstanceIdService:

This class was deprecated.

In favour of overriding onNewToken in FirebaseMessagingService. Once that has been implemented, this service can be safely removed.

Как ни странно, JavaDoc для FirebaseMessagingService еще не упоминает метод onNewToken. Похоже, что еще не вся обновленная документация опубликована. Я зарегистрировал внутреннюю проблему, чтобы получить обновления опубликованных справочных документов, а также обновить образцы в руководстве.

Тем временем должны работать как старые / устаревшие вызовы, так и новые. Если у вас возникнут проблемы, опубликуйте код, и я посмотрю.

Документы Firebase тоже еще не обновлялись.

Rosário Pereira Fernandes 02.07.2018 02:46

Да, @frank, метод существует, но соответствующие документы еще не обновлены.

Uttam Panchasara 02.07.2018 07:27

@kev Это похоже на (действительный) новый вопрос. Пожалуйста, создайте новое сообщение с минимальным полным фрагментом кода.

Frank van Puffelen 12.07.2018 15:20

@FrankvanPuffelen уже сделал. Взглянуть. stackoverflow.com/questions/51296171/…

kev 12.07.2018 15:21

Об этом обновлении я узнал и для Xamarin Android. Добавлен метод OnNewToken в класс, расширяющий FirebaseMessagingService. Но этот метод не попал. Я не могу понять, что мне делать. Это другое в файле манифеста Android для xamarin.

Prabesh 16.08.2018 19:03

Обновление 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 onNewToken in FirebaseMessagingService. 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 FirebaseMessagingService in 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 Use getInstanceId ()

Теперь нам нужно использовать 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())

    }
}

Комментарии не подлежат расширенному обсуждению; этот разговор был переехал в чат.

Samuel Liew 22.08.2018 07:34

почему никто не показывает, как импортировать FirebaseMessagingService?

temirbek 20.03.2020 15:39

привет, что я должен использовать FirebaseInstallations или FirebaseMessaging?

Tony 29.12.2020 11:38

@Tony сейчас использую FirebaseMessaging.getInstance()

AskNilesh 30.12.2020 08:31

этот ответ должен быть принят, чтобы помочь другим найти устаревшую проблему. многие статьи все еще используют FirebaseInstanceId для получения нового токена FCM. Надеюсь, другие прочитают мой комментарий

Yohanes AI 18.03.2021 08:16

И это:

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) (без вопросительного знака).

Csaba Toth 08.06.2020 03:46

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 29.12.2020 11:39

Привет @Tony! Для отправки облачного сообщения через firebase необходимо использовать firebase-messaging. Похоже, что firebase-installation не предоставляет полный токен, необходимый для отправки облачного сообщения на другие устройства. Поправьте меня, если я ошибаюсь. TIA!

niranj1997 29.12.2020 18:55

Вместо этого используйте 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
SqAR.org 28.01.2021 13:02

getInstance().getInstanceId() также устарел, и сейчас используется FirebaseMessaging.

FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val token = task.result
    } else {
        Timber.e(task.exception)
    }
}

Что делает forceRefresh? обновлять токен при открытии активности?

Abhishek AN 07.12.2020 16:41

@AbhishekAN да, это заставит его получить новый токун.

OhhhThatVarun 08.12.2020 00:29

привет, что я должен использовать FirebaseInstallations или FirebaseMessaging?

Tony 29.12.2020 11:39

@Tony Проверьте обновленный ответ.

OhhhThatVarun 29.12.2020 12:35

И вот решение для 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()

Вот и все.

Другие вопросы по теме