FirebaseInstanceIdService устарела

225

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

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

NEW От: FirebaseMessagingService

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Log.d("NEW_TOKEN",s);
}

Спасибо.

Уттам Панчасара
источник
1
Перекрестная публикация на GitHub
Росарио Перейра Фернандес
Здесь также: medium.com/android-school/…
Пратик Бутани
онлайн документация только что обновлена. firebase.google.com/docs/reference/android/com/google/firebase/...
jackycflau
Нужно / правильно звонить super.onNewToken(s);? (Я не вижу, чтобы его вызывали на firebase.google.com/docs/cloud-messaging/android/client .)
ban-geoengineering
будут ли какие-либо изменения в манифесте?
Муахмад Тайиб

Ответы:

122

пожарный здесь

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

Этот класс устарел.

В пользу переопределения onNewTokenв FirebaseMessagingService. Как только это будет реализовано, этот сервис можно безопасно удалить.

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

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

Фрэнк ван Пуффелен
источник
7
В Firebase Docs также не обновлено.
Росарио Перейра Фернандес
1
Да, @frank, метод существует, но соответствующие документы еще не обновлены.
Уттам Панчасара
@kev Это звучит как (правильный) новый вопрос. Пожалуйста, создайте новое сообщение с минимальным полным фрагментом кода.
Фрэнк ван Пуффелен
@FrankvanPuffelen уже сделал. Посмотри. stackoverflow.com/questions/51296171/...
kev
1
Я также узнал об этом обновлении для Xamarin Android. Добавлен метод OnNewToken в классе, который расширяет FirebaseMessagingService. Но этот метод не ударил. Я не могу понять, что мне делать. Отличается ли он в файле Android Manifest для xamarin.
Прабеш
133

Да FirebaseInstanceIdService не рекомендуется

ОТ ДОКУМЕНТОВ: - Этот класс устарел. В пользу 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());
    }
}

РЕДАКТИРОВАТЬ

Вам необходимо зарегистрировать свой FirebaseMessagingService файл манифеста следующим образом

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

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

как получить токен в своей деятельности

.getToken(); также не рекомендуется, если вам нужно получить токен в своей деятельности, чем использовать getInstanceId ()

Теперь нам нужно использовать getInstanceId () для генерации токена

getInstanceId () Возвращает ID и автоматически сгенерированный токен для этогоFirebase проекта.

Это генерирует ID экземпляра, если он еще не существует, который начинает периодически отправлять информацию в серверную часть 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())

    }
}
Нилеш Ратод
источник
1
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Сэмюэл Лью
почему никто не показывает, как импортировать FirebaseMessagingService?
Темирбек
12

И это:

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)
    }
Александар Миронов
источник
5

Kotlin допускает даже более простой код, чем показано в других ответах.

Чтобы получить новый токен всякий раз, когда он обновляется:

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);
    }
}
Harunduet
источник
4

В KOTLIN: - Если вы хотите сохранить токен в БД или общие настройки, переопределите 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)(без знака вопроса).
Чаба Тот
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);
 }
}
}

И вызовите его инициализацию в 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», не забудьте отключить его.

Хамед Джалилиани
источник
1

Вы должны использовать FirebaseMessagingService() вместоFirebaseInstanceIdService

Сахил Бансал
источник