FirebaseInstanceIdService jest przestarzały

224

Mam nadzieję, że wszyscy znacie tę klasę, używaną do uzyskania tokena powiadomień za każdym razem, gdy token powiadomienia bazy ogniowej zostanie odświeżony, otrzymujemy odświeżony token z tej klasy, z następującej metody.

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

Aby użyć tego, ponieważ chcę zaimplementować FCM, rozszerzyłem MyClass z FirebaseInstanceIdService

Ale Pokazywanie, że FirebaseInstanceIdService jest przestarzałe

Czy ktoś to wie ?, Jakiej metody lub klasy powinienem użyć zamiast tego, aby otrzymać odświeżony token, ponieważ jest on przestarzały.

Używam : implementation 'com.google.firebase:firebase-messaging:17.1.0'

Sprawdziłem dokument pod kątem tego samego, nic o tym nie wspomniano. : DOKUMENT USTAWIEŃ FCM


AKTUALIZACJA

Ten problem został rozwiązany.

Ponieważ Google wycofało FirebaseInstanceService,

Zadałem pytanie, aby znaleźć drogę, i dowiaduję się, że możemy pobrać Token z FirebaseMessagingService ,

Tak jak poprzednio, kiedy zadałem pytanie Dokumenty pytań nie zostały zaktualizowane, ale Dokumenty Google zostały zaktualizowane, aby uzyskać więcej informacji, zapoznaj się z tym dokumentem Google: FirebaseMessagingService

OLD From: FirebaseInstanceService (Przestarzałe)

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

NOWOŚĆ Od: FirebaseMessagingService

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

Dzięki.

Uttam Panchasara
źródło
1
Przeniesiony
Rosário Pereira Fernandes
Tutaj również: medium.com/android-school/…
Pratik Butani
dokumentacja online jest właśnie aktualizowana. firebase.google.com/docs/reference/android/com/google/firebase/…
jackycflau
Czy połączenie jest konieczne / prawidłowe super.onNewToken(s);? (Nie widzę, aby był wywoływany na firebase.google.com/docs/cloud-messaging/android/client .)
ban-geoengineering
czy będzie jakaś zmiana manifestu?
Muahmmad Tayyib,

Odpowiedzi:

122

firebaser tutaj

Sprawdź dokumentację referencyjnąFirebaseInstanceIdService :

Ta klasa była przestarzała.

Na korzyść zastąpienia onNewTokenw FirebaseMessagingService. Po wdrożeniu tę usługę można bezpiecznie usunąć.

Co dziwne, JavaDoc FirebaseMessagingServicenie wspomina onNewTokenjeszcze o metodzie. Wygląda na to, że nie opublikowano jeszcze całej zaktualizowanej dokumentacji. Złożyłem wewnętrzny problem, aby opublikować aktualizacje dokumentów referencyjnych oraz zaktualizować próbki w przewodniku.

W międzyczasie zarówno stare / przestarzałe połączenia, jak i nowe powinny działać. Jeśli masz problem z którymkolwiek z nich, opublikuj kod, a ja zajrzę.

Frank van Puffelen
źródło
7
W Firebase Docs zostały również nie zostały jeszcze zaktualizowane.
Rosário Pereira Fernandes
1
Tak @frank, metoda istnieje, ale powiązane dokumenty nie zostały jeszcze zaktualizowane.
Uttam Panchasara,
@kev To brzmi jak (ważne) nowe pytanie. Utwórz nowy post z minimalnym pełnym fragmentem kodu.
Frank van Puffelen,
@FrankvanPuffelen już to zrobił. Spójrz. stackoverflow.com/questions/51296171/…
kev
1
Znalazłem też informacje o tej aktualizacji dla Xamarin Android. Dodano metodę OnNewToken w klasie, która rozszerza FirebaseMessagingService. Ale ta metoda nie została trafiona. Nie mogę wymyślić, co powinienem zrobić. Czy jest inaczej w pliku manifestu Androida dla Xamarina.
Prabesh
133

Tak, FirebaseInstanceIdService jest przestarzałe

FROM DOCS: - Ta klasa była przestarzała. Na korzyść overriding onNewTokenw FirebaseMessagingService. Po wdrożeniu tę usługę można bezpiecznie usunąć.

Nie trzeba korzystać z FirebaseInstanceIdServiceusługi, aby uzyskać token FCM. Można bezpiecznie usunąć FirebaseInstanceIdServiceusługę

Teraz musimy @Override onNewToken dostać TokenwFirebaseMessagingService

PRZYKŁADOWY KOD

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

EDYTOWAĆ

Musisz zarejestrować swój FirebaseMessagingServiceplik manifestu w ten sposób

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

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

jak zdobyć token w swojej działalności

.getToken(); jest również przestarzałe, jeśli musisz zdobyć token w swojej aktywności niż Użyj getInstanceId ()

Teraz musimy użyć getInstanceId ()do wygenerowania tokena

getInstanceId ()Zwraca IDi automatycznie generowany token dla tego Firebaseprojektu.

Generuje to identyfikator wystąpienia, jeśli jeszcze nie istnieje, co powoduje okresowe wysyłanie informacji do zaplecza Firebase.

Zwroty

  • Zadanie, którego możesz użyć, aby zobaczyć wynik za pomocą, InstanceIdResultktóry przechowuje IDi token.

PRZYKŁADOWY KOD

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

     }
 });

EDYCJA 2

Oto działający kod dla 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
źródło
1
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Samuel Liew
dlaczego nikt nie pokazuje, jak importować FirebaseMessagingService?
temirbek
12

I to:

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

załóżmy, że jest to rozwiązanie przestarzałe:

FirebaseInstanceId.getInstance().getToken()

EDYTOWAĆ

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() może wygenerować wyjątek, jeśli zadanie nie zostało jeszcze zakończone, więc metoda, którą opisał (z .addOnSuccessListener) Nilesh Rathod, jest poprawna.

Kotlin:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
        val newToken = instanceIdResult.token
        Log.e("newToken", newToken)
    }
Aleksandar Mironov
źródło
5

Kotlin pozwala na jeszcze prostszy kod niż pokazano w innych odpowiedziach.

Aby pobrać nowy token za każdym razem, gdy jest odświeżany:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

Aby pobrać token z dowolnego miejsca w środowisku wykonawczym:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
    Log.d("FMS_TOKEN", it.token)
}
Gumby The Green
źródło
5

FirebaseinstanceIdServicejest przestarzałe. Więc muszę użyć „FirebaseMessagingService”

Proszę o zdjęcie:

wprowadź opis zdjęcia tutaj

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
źródło
4

W Kotlin: - Jeśli chcesz zapisać token w DB lub wspólne preferencje następnie zastąpić onNewToken w FirebaseMessagingService

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

Zdobądź token w czasie wykonywania, użyj

FirebaseInstanceId.getInstance().instanceId
                        .addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
                            val mToken = instanceIdResult.token
                            println("printing  fcm token: $mToken")
                        }
Rahul
źródło
Teraz jest override fun onNewToken(token: String)(bez znaku zapytania).
Csaba Toth
1

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

I wywołaj jego inicjalizację w działaniu lub aplikacji:

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>

** Jeśli dodałeś „INSTANCE_ID_EVENT”, nie pamiętaj o jego wyłączeniu.

Hamed Jaliliani
źródło
1

Musisz użyć FirebaseMessagingService() zamiastFirebaseInstanceIdService

Sahil Bansal
źródło