FirebaseInstanceIdService est obsolète

224

J'espère que vous êtes tous au courant de cette classe, utilisée pour obtenir un jeton de notification chaque fois que le jeton de notification Firebase est actualisé.Nous obtenons le jeton actualisé de cette classe, à partir de la méthode suivante.

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
}

Pour l'utiliser comme je veux implémenter FCM, j'ai étendu MyClass à partir de FirebaseInstanceIdService

Mais, montrant que FirebaseInstanceIdService est obsolète

Quelqu'un le sait-il ?, Quelle méthode ou classe dois-je utiliser à la place de cela pour obtenir un jeton actualisé car il est obsolète.

J'utilise : implementation 'com.google.firebase:firebase-messaging:17.1.0'

J'ai vérifié le document pour la même chose, il n'y a rien à ce sujet. : DOCUMENT DE CONFIGURATION FCM


METTRE À JOUR

Ce problème a été corrigé.

Comme Google a déprécié le FirebaseInstanceService,

J'ai posé la question pour trouver le chemin et je sais que nous pouvons obtenir le jeton de FirebaseMessagingService ,

Comme auparavant, lorsque j'ai posé la question, les documents n'ont pas été mis à jour, mais maintenant les documents Google ont été mis à jour. Pour plus d'informations, reportez-vous à ce document Google: FirebaseMessagingService

OLD From: FirebaseInstanceService (obsolète)

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
}

NOUVEAU sur: FirebaseMessagingService

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

Merci.

Uttam Panchasara
la source
1
Posté sur GitHub
Rosário Pereira Fernandes le
Ici aussi: medium.com/android-school/…
Pratik Butani
la documentation en ligne vient d'être mise à jour. firebase.google.com/docs/reference/android/com/google/firebase/…
jackycflau
Est-il nécessaire / correct d'appeler super.onNewToken(s);? (Je ne vois pas qu'il soit appelé sur firebase.google.com/docs/cloud-messaging/android/client .)
ban-geoengineering
y aurait-il un changement dans le manifeste?
Muahmmad Tayyib

Réponses:

122

Firebaser ici

Consultez la documentation de référence pourFirebaseInstanceIdService :

Cette classe est déconseillée.

En faveur de l' annulation onNewTokende FirebaseMessagingService. Une fois que cela a été mis en œuvre, ce service peut être supprimé en toute sécurité.

Curieusement, le JavaDoc pour FirebaseMessagingServicene mentionne pas encore la onNewTokenméthode. Il semble que toute la documentation mise à jour n'ait pas encore été publiée. J'ai déposé un problème interne pour que les mises à jour des documents de référence soient publiées et pour que les exemples du guide soient également mis à jour.

En attendant, les appels anciens / obsolètes et les nouveaux devraient fonctionner. Si vous rencontrez des problèmes avec l'un ou l'autre, postez le code et je vais y jeter un œil.

Frank van Puffelen
la source
7
Les documents Firebase n'ont pas encore été mis à jour.
Rosário Pereira Fernandes
1
Oui @frank, la méthode existe, mais les documents associés ne sont pas encore mis à jour.
Uttam Panchasara
@kev Cela ressemble à une nouvelle question (valide). Veuillez créer un nouveau message, avec un extrait de code complet minimal.
Frank van Puffelen
@FrankvanPuffelen l'a déjà fait. Regarde. stackoverflow.com/questions/51296171/…
kev
1
J'ai également découvert cette mise à jour pour Xamarin Android. Ajout de la méthode OnNewToken dans la classe qui étend FirebaseMessagingService. Mais cette méthode n'est pas atteinte. Je n'arrive pas à comprendre ce que je dois faire. Est-ce différent dans le fichier manifeste Android pour xamarin.
Prabesh
133

Oui FirebaseInstanceIdService est obsolète

FROM DOCS: - Cette classe a été déconseillée. En faveur de overriding onNewTokendans FirebaseMessagingService. Une fois que cela a été mis en œuvre, ce service peut être supprimé en toute sécurité.

Pas besoin d'utiliser le FirebaseInstanceIdServiceservice pour obtenir le jeton FCM Vous pouvez supprimer le FirebaseInstanceIdServiceservice en toute sécurité

Maintenant , nous devons @Override onNewToken obtenir TokendansFirebaseMessagingService

EXEMPLE DE CODE

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

ÉDITER

Vous devez enregistrer votre FirebaseMessagingServicefichier manifeste comme ceci

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

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

comment obtenir des jetons dans votre activité

.getToken(); est également déconseillé si vous devez obtenir un jeton dans votre activité que Utiliser getInstanceId ()

Maintenant, nous devons utiliser getInstanceId ()pour générer un jeton

getInstanceId ()Renvoie le IDjeton généré automatiquement pour ce Firebaseprojet.

Cela génère un ID d'instance s'il n'existe pas encore, ce qui commence à envoyer périodiquement des informations au backend Firebase.

Retour

  • Tâche que vous pouvez utiliser pour voir le résultat via le InstanceIdResultqui contient le IDet token.

EXEMPLE DE CODE

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

Voici le code de travail pour 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())

    }
}
Nilesh Rathod
la source
1
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Samuel Liew
pourquoi personne ne montre comment importer FirebaseMessagingService?
temirbek
12

Et ça:

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

supposons être une solution obsolète:

FirebaseInstanceId.getInstance().getToken()

ÉDITER

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() peut produire une exception si la tâche n'est pas encore terminée, la méthode décrite par Nilesh Rathod (avec .addOnSuccessListener ) est la bonne façon de le faire.

Kotlin:

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

Kotlin permet un code encore plus simple que ce qui est montré dans les autres réponses.

Pour obtenir le nouveau jeton chaque fois qu'il est actualisé:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

Pour obtenir le jeton de n'importe où lors de l'exécution:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
    Log.d("FMS_TOKEN", it.token)
}
Gumby The Green
la source
5

FirebaseinstanceIdServiceest obsolète. Il faut donc utiliser "FirebaseMessagingService"

Mer l'image s'il vous plaît:

entrez la description de l'image ici

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
la source
4

Dans KOTLIN: - Si vous souhaitez enregistrer le jeton dans la base de données ou les préférences partagées, remplacez onNewToken dans FirebaseMessagingService

override fun onNewToken(token: String) {
        super.onNewToken(token)
    }

Obtenez un jeton au moment de l'exécution, utilisez

FirebaseInstanceId.getInstance().instanceId
                        .addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
                            val mToken = instanceIdResult.token
                            println("printing  fcm token: $mToken")
                        }
Rahul
la source
Maintenant c'est override fun onNewToken(token: String)(sans le point d'interrogation).
Csaba Toth
1

Classe d'implémentation 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);
 }
}
}

Et appelez son initialisation dans Activity ou 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>

** Si vous avez ajouté "INSTANCE_ID_EVENT", n'oubliez pas de le désactiver.

Hamed Jaliliani
la source
1

Vous devez utiliser FirebaseMessagingService() au lieu deFirebaseInstanceIdService

Sahil Bansal
la source