FirebaseInstanceIdService застаріло


224

Сподіваємось, що ви всі знаєте про цей клас, використовувались для отримання маркера сповіщень кожного разу, коли маркер сповіщення 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);
}

Дякую.


1
Перехресне повідомлення на GitHub
Розаріо Перейра Фернандес


онлайн-документація щойно оновлюється. firebase.google.com/docs/reference/android/com/google/firebase/…
jackycflau

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

чи буде якась зміна в маніфесті?
Muahmmad Tayyib

Відповіді:


122

тут пожежник

Перевірте довідкову документацію наFirebaseInstanceIdService :

Цей клас застарілий.

На користь відміни onNewTokenв FirebaseMessagingService. Після того, як це було здійснено, цю послугу можна буде безпечно видалити.

Як не дивно, JavaDoc для FirebaseMessagingServiceцього onNewTokenметоду ще не згадує . Схоже, ще не опублікована вся оновлена ​​документація. Я подав внутрішній випуск, щоб оновлювати оновлення довідкових документів, а також оновлювати зразки в посібнику.

Тим часом як старі, так і застарілі дзвінки повинні працювати. Якщо у вас виникли проблеми з будь-яким, опублікуйте код, і я перегляну.



1
Так @frank, метод існує, але пов'язані документи ще не оновлені.
Уттам Панчасара

@kev Це звучить як (дійсне) нове запитання. Створіть нову публікацію з мінімальним повним фрагментом коду.
Франк ван Пуффелен

@FrankvanPuffelen вже зробив. Подивитися. stackoverflow.com/questions/51296171 / ...
до

1
Про це оновлення я дізнався і для Xamarin Android. Додано метод OnNewToken у класі, який розширює FirebaseMessagingService. Але цей метод не вдарив. Я не можу зрозуміти, що мені робити. Чи відрізняється він у файлі Android Manifest для xamarin.
Прабеш

133

Так FirebaseInstanceIdService , застаріло

ВІД DOCS: - Цей клас застарілий. На користь overriding onNewTokenв FirebaseMessagingService. Після того, як це було здійснено, цю послугу можна буде безпечно видалити.

Не потрібно користуватися 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());
    }
}

EDIT

Потрібно зареєструвати такий FirebaseMessagingServiceфайл маніфесту, як цей

    <service
        android:name=".MyFirebaseMessagingService"
        android:stopWithTask="false">
        <intent-filter>

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

як отримати маркер у своїй діяльності

.getToken(); також застаріло, якщо вам потрібно отримати маркер у своїй діяльності, ніж 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);

     }
 });

EDIT 2

Ось робочий код для kotlin

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())

    }
}

1
Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Самуель Liew

чому ніхто не показує, як імпортувати FirebaseMessagingService?
temirbek

12

І це:

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()

припустимо, що це рішення застарілого:

FirebaseInstanceId.getInstance().getToken()

EDIT

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() може створити виняток, якщо завдання ще не виконане, тому метод, який відьма Нілеша Ратода описав (з .addOnSuccessListener), є правильним способом його виконання.

Котлін:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
        val newToken = instanceIdResult.token
        Log.e("newToken", newToken)
    }

5

Котлін дозволяє отримати ще простіший код, ніж той, що показано в інших відповідях.

Щоб отримати новий маркер, коли він оновлюється:

class MyFirebaseMessagingService: FirebaseMessagingService() {

    override fun onNewToken(token: String?) {
        Log.d("FMS_TOKEN", token)
    }
    ...
}

Щоб отримати маркер з будь-якого місця під час виконання:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
    Log.d("FMS_TOKEN", it.token)
}

5

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

4

У Котлин: - Якщо ви хочете зберегти токен в БД або загальні переваги потім перевизначити 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

1

Клас реалізації 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);
 }
}
}

І зателефонуйте на ініціалізацію в «Активність» або «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", не забудьте його відключити.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.