FirebaseInstanceIdService ist veraltet

223

Ich hoffe, Sie alle kennen diese Klasse, die verwendet wird, um Benachrichtigungstoken zu erhalten, wenn das Firebase-Benachrichtigungstoken aktualisiert wurde. Wir erhalten das aktualisierte Token von dieser Klasse. Von der folgenden Methode.

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

Um dies zu verwenden, wenn ich FCM implementieren möchte, habe ich MyClass von erweitert FirebaseInstanceIdService

Es wird jedoch angezeigt, dass FirebaseInstanceIdService veraltet ist

Weiß jemand das? Welche Methode oder Klasse sollte ich stattdessen verwenden, um ein aktualisiertes Token zu erhalten, da dies veraltet ist?

Ich benutze : implementation 'com.google.firebase:firebase-messaging:17.1.0'

Ich habe das Dokument auf dasselbe überprüft, es wird nichts darüber erwähnt. : FCM-SETUP-DOKUMENT


AKTUALISIEREN

Dieses Problem wurde behoben.

Da Google das ablehnte FirebaseInstanceService,

Ich habe die Frage gestellt, um den Weg zu finden, und ich erfahre, dass wir das Token von FirebaseMessagingService erhalten können.

Wie zuvor, als ich die Frage stellte, wurden die Dokumente nicht aktualisiert, aber jetzt wurden die Google-Dokumente aktualisiert. Weitere Informationen finden Sie in diesem Google-Dokument: FirebaseMessagingService

ALT von: FirebaseInstanceService (veraltet)

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

NEU Von: FirebaseMessagingService

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

Vielen Dank.

Uttam Panchasara
quelle
1
Cross-posted auf GitHub
Rosário Pereira Fernandes
Hier auch: medium.com/android-school/…
Pratik Butani
Die Online-Dokumentation wurde gerade aktualisiert. firebase.google.com/docs/reference/android/com/google/firebase/…
jackycflau
Ist es notwendig / richtig anzurufen super.onNewToken(s);? (Ich sehe es nicht aufgerufen werden firebase.google.com/docs/cloud-messaging/android/client .)
ban-Geoengineering
Würde sich das Manifest ändern?
Muahmmad Tayyib

Antworten:

122

Firebaser hier

Überprüfen Sie die Referenzdokumentation aufFirebaseInstanceIdService :

Diese Klasse war veraltet.

Zugunsten der überwiegenden onNewTokenin FirebaseMessagingService. Sobald dies implementiert wurde, kann dieser Dienst sicher entfernt werden.

Seltsamerweise FirebaseMessagingServiceerwähnt JavaDoc die onNewTokenMethode noch nicht. Es sieht so aus, als ob noch nicht alle aktualisierten Dokumentationen veröffentlicht wurden. Ich habe ein internes Problem eingereicht, um die Aktualisierungen der Referenzdokumente zu veröffentlichen und um die Beispiele im Handbuch ebenfalls zu aktualisieren.

In der Zwischenzeit sollten sowohl die alten / veralteten als auch die neuen Anrufe funktionieren. Wenn Sie Probleme damit haben, geben Sie den Code ein und ich werde einen Blick darauf werfen.

Frank van Puffelen
quelle
7
Die Firebase-Dokumente wurden ebenfalls noch nicht aktualisiert.
Rosário Pereira Fernandes
1
Ja @frank, die Methode existiert, aber verwandte Dokumente wurden noch nicht aktualisiert.
Uttam Panchasara
@kev Das klingt nach einer (gültigen) neuen Frage. Bitte erstellen Sie einen neuen Beitrag mit einem minimalen vollständigen Code-Snippet.
Frank van Puffelen
@FrankvanPuffelen schon. Guck mal. stackoverflow.com/questions/51296171/…
kev
1
Ich habe auch über dieses Update für Xamarin Android gefunden. OnNewToken-Methode in Klasse hinzugefügt, die FirebaseMessagingService erweitert. Aber diese Methode wird nicht getroffen. Ich kann nicht herausfinden, was ich tun soll. Ist es anders in Android Manifest-Datei für Xamarin.
Prabesh
133

Ja FirebaseInstanceIdService ist veraltet

FROM DOCS: - Diese Klasse war veraltet. Für overriding onNewTokenin FirebaseMessagingService. Sobald dies implementiert wurde, kann dieser Dienst sicher entfernt werden.

Sie müssen keinen FirebaseInstanceIdServiceDienst verwenden, um das FCM-Token zu erhalten. Sie können es sicher entfernenFirebaseInstanceIdService Dienst

Jetzt müssen wir @Override onNewToken erhalten TokeninFirebaseMessagingService

BEISPIELCODE

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

BEARBEITEN

Sie müssen Ihre FirebaseMessagingServiceManifest-Datei wie folgt registrieren

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

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

wie Sie Token in Ihrer Aktivität erhalten

.getToken(); ist auch veraltet, wenn Sie in Ihrer Aktivität ein Token als Verwenden benötigen getInstanceId ()

Jetzt müssen wir verwenden getInstanceId (), um Token zu generieren

getInstanceId ()Gibt das IDautomatisch generierte Token für dieses FirebaseProjekt zurück.

Dadurch wird eine Instanz-ID generiert, falls diese noch nicht vorhanden ist. Diese sendet regelmäßig Informationen an das Firebase-Backend.

Kehrt zurück

  • Aufgabe, mit der Sie das Ergebnis sehen können, über die InstanceIdResultdas IDund enthält token.

BEISPIELCODE

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

     }
 });

BEARBEITEN 2

Hier ist der Arbeitscode für 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
quelle
1
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Samuel Liew
Warum zeigt niemand, wie FirebaseMessagingService importiert wird?
Temirbek
12

Und das:

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

Angenommen, es handelt sich um eine veraltete Lösung:

FirebaseInstanceId.getInstance().getToken()

BEARBEITEN

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() kann eine Ausnahme erzeugen, wenn die Aufgabe noch nicht abgeschlossen ist. Daher ist die Methode, die Nilesh Rathod (mit .addOnSuccessListener) beschrieben hat, der richtige Weg, dies zu tun.

Kotlin:

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

Kotlin ermöglicht noch einfacheren Code als in anderen Antworten gezeigt.

So erhalten Sie das neue Token, wenn es aktualisiert wird:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

So erhalten Sie das Token zur Laufzeit von überall:

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

FirebaseinstanceIdServiceist veraltet. Also muss "FirebaseMessagingService" verwendet werden

Meer das Bild bitte:

Geben Sie hier die Bildbeschreibung ein

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
quelle
4

In KOTLIN: - Wenn Sie Token in der Datenbank oder in freigegebenen Einstellungen speichern möchten, überschreiben Sie onNewToken in FirebaseMessagingService

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

Holen Sie sich Token zur Laufzeit, verwenden Sie

FirebaseInstanceId.getInstance().instanceId
                        .addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
                            val mToken = instanceIdResult.token
                            println("printing  fcm token: $mToken")
                        }
Rahul
quelle
Jetzt ist es override fun onNewToken(token: String)(ohne das Fragezeichen).
Csaba Toth
1

FCM-Implementierungsklasse:

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

Und rufen Sie die Initialisierung in Aktivität oder APP auf:

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>

** Wenn Sie "INSTANCE_ID_EVENT" hinzugefügt haben, denken Sie nicht daran, es zu deaktivieren.

Hamed Jaliliani
quelle
1

Sie müssen FirebaseMessagingService() anstelle von verwendenFirebaseInstanceIdService

Sahil Bansal
quelle