FirebaseInstanceIdService è obsoleto


224

Spero che tutti voi sia a conoscenza di questa classe, utilizzata per ottenere il token di notifica ogni volta che il token di notifica Firebase è stato aggiornato, otteniamo il token aggiornato da questa classe, dal seguente metodo.

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

Per usare questo come voglio implementare FCM, ho esteso MyClass da FirebaseInstanceIdService

Ma, mostrando che FirebaseInstanceIdService è obsoleto

Qualcuno lo sa ?, Quale metodo o classe dovrei usare al posto di questo per ottenere un token aggiornato poiché questo è deprecato.

Sto usando : implementation 'com.google.firebase:firebase-messaging:17.1.0'

Ho controllato il documento per lo stesso non si parla di questo. : DOCUMENTO DI CONFIGURAZIONE FCM


AGGIORNARE

Questo problema è stato risolto.

Poiché Google ha deprecato il FirebaseInstanceService,

Ho posto la domanda per trovare la strada e mi rendo conto che possiamo ottenere il token da FirebaseMessagingService ,

Come prima, quando ho chiesto che i documenti delle domande non fossero aggiornati ma ora i documenti di Google sono stati aggiornati, per ulteriori informazioni, consultare questo documento di Google: FirebaseMessagingService

VECCHIO da: FirebaseInstanceService (obsoleto)

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

NOVITÀ Da: FirebaseMessagingService

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

Grazie.




la documentazione online è appena stata aggiornata. firebase.google.com/docs/reference/android/com/google/firebase/…
jackycflau

È necessario / corretto chiamare super.onNewToken(s);? (Non vedo che viene chiamato su firebase.google.com/docs/cloud-messaging/android/client .)
ban-geoengineering,

ci sarebbe qualche cambiamento in manifest?
Muahmmad Tayyib,

Risposte:


122

firebaser qui

Controlla la documentazione di riferimento perFirebaseInstanceIdService :

Questa classe è stata deprecata.

A favore di rilevante onNewTokenin FirebaseMessagingService. Una volta implementato, questo servizio può essere rimosso in modo sicuro.

Stranamente JavaDoc per FirebaseMessagingServicenon menziona onNewTokenancora il metodo. Sembra che non tutta la documentazione aggiornata sia stata ancora pubblicata. Ho presentato un problema interno per pubblicare gli aggiornamenti dei documenti di riferimento e per aggiornare anche i campioni nella guida.

Nel frattempo dovrebbero funzionare sia le chiamate vecchie / deprecate, sia quelle nuove. Se hai problemi con entrambi, pubblica il codice e darò un'occhiata.


7
Anche i documenti Firebase non sono stati ancora aggiornati.
Rosário Pereira Fernandes,

1
Sì @frank, il metodo esiste, ma i documenti correlati non sono ancora stati aggiornati.
Uttam Panchasara,

@kev Sembra una nuova (valida) domanda. Crea un nuovo post, con uno snippet di codice completo minimo.
Frank van Puffelen,

@FrankvanPuffelen lo ha già fatto. Dare un'occhiata. stackoverflow.com/questions/51296171/…
kev

1
Ho scoperto questo aggiornamento anche per Xamarin Android. Aggiunto metodo OnNewToken nella classe che estende FirebaseMessagingService. Ma quel metodo non è colpito. Non riesco a capire cosa devo fare. È diverso nel file manifest di Android per xamarin.
Prabesh,

133

FirebaseInstanceIdService è obsoleto

DA DOCUMENTI: - Questa classe è stata deprecata. A favore di overriding onNewTokena FirebaseMessagingService. Una volta implementato, questo servizio può essere rimosso in modo sicuro.

Non è necessario utilizzare il FirebaseInstanceIdServiceservizio per ottenere il token FCM È possibile rimuovere in sicurezza il FirebaseInstanceIdServiceservizio

Ora abbiamo bisogno di @Override onNewToken entrare TokeninFirebaseMessagingService

CODICE DI ESEMPIO

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

MODIFICARE

Devi registrare il tuo FirebaseMessagingServicefile manifest in questo modo

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

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

come ottenere il token nella tua attività

.getToken(); è inoltre obsoleto se è necessario ottenere token nella propria attività rispetto a Usa getInstanceId ()

Ora dobbiamo usare getInstanceId ()per generare token

getInstanceId ()Restituisce il IDtoken generato automaticamente per questo Firebaseprogetto.

Questo genera un ID istanza se non esiste ancora, che inizia a inviare periodicamente informazioni al back-end di Firebase.

ritorna

  • Compito che è possibile utilizzare per visualizzare il risultato tramite il InstanceIdResultquale contiene il IDe token.

CODICE DI ESEMPIO

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this,  new OnSuccessListener<InstanceIdResult>() {
     @Override
     public void onSuccess(InstanceIdResult instanceIdResult) {
           String newToken = instanceIdResult.getToken();
           Log.e("newToken",newToken);

     }
 });

MODIFICA 2

Ecco il codice di lavoro per 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
I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Samuel Liew

perché nessuno mostra come importare FirebaseMessagingService?
temirbek

12

E questo:

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

supponiamo di essere una soluzione deprecata:

FirebaseInstanceId.getInstance().getToken()

MODIFICARE

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() può produrre un'eccezione se l'attività non è stata ancora completata, quindi il metodo descritto da Nilesh Rathod (con .addOnSuccessListener) è il modo corretto di eseguirlo.

Kotlin:

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

5

Kotlin consente un codice ancora più semplice di quello mostrato in altre risposte.

Per ottenere il nuovo token ogni volta che viene aggiornato:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

Per ottenere il token da qualsiasi luogo in fase di runtime:

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

5

FirebaseinstanceIdServiceè deprecato. Quindi devi usare "FirebaseMessagingService"

Mare l'immagine per favore:

inserisci qui la descrizione dell'immagine

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

In KOTLIN: - Se vuoi salvare token in DB o preferenze condivise, sovrascrivi su NewToken in FirebaseMessagingService

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

Ottieni token in fase di esecuzione, utilizzare

FirebaseInstanceId.getInstance().instanceId
                        .addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
                            val mToken = instanceIdResult.token
                            println("printing  fcm token: $mToken")
                        }

Ora è override fun onNewToken(token: String)(senza il punto interrogativo).
Csaba Toth,

1

Classe di implementazione 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);
 }
}
}

E chiamane l'inizializzazione in Attività o 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>

** Se hai aggiunto "INSTANCE_ID_EVENT", ricordati di disabilitarlo.


1

Devi usare FirebaseMessagingService() invece diFirebaseInstanceIdService

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.