FirebaseInstanceIdService está en desuso

224

Espero que todos ustedes conozcan esta clase, utilizada para obtener el token de notificación cada vez que se actualiza el token de notificación de Firebase. Obtenemos el token actualizado de esta clase, del siguiente método.

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

Para usar esto como quiero implementar FCM, extendí MyClass desde FirebaseInstanceIdService

Pero, mostrando que FirebaseInstanceIdService está en desuso

¿Alguien sabe esto? ¿Qué método o clase debo usar en lugar de esto para obtener un token actualizado ya que está en desuso?

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

Verifiqué el documento para saber que no hay nada mencionado sobre esto. : DOCUMENTO DE CONFIGURACIÓN DEL FCM


ACTUALIZAR

El problema ha sido resuelto.

Como Google desaprobó el FirebaseInstanceService,

Hice la pregunta para encontrar el camino y sé que podemos obtener el token de FirebaseMessagingService ,

Como antes, cuando pregunté, los Documentos de preguntas no se actualizaron, pero ahora los documentos de Google se actualizaron para obtener más información. Consulte este documento de Google: FirebaseMessagingService

ANTIGUO De: FirebaseInstanceService (en desuso)

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

NUEVO de: FirebaseMessagingService

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

Gracias.

Uttam Panchasara
fuente
1
Publicación cruzada en GitHub
Rosário Pereira Fernandes
Aquí también: medium.com/android-school/…
Pratik Butani
La documentación en línea se acaba de actualizar. firebase.google.com/docs/reference/android/com/google/firebase/…
jackycflau
¿Es necesario / correcto llamar super.onNewToken(s);? (No veo que se llame en firebase.google.com/docs/cloud-messaging/android/client .)
ban-geoengineering
¿Habría algún cambio en el manifiesto?
Muahmmad Tayyib

Respuestas:

122

bombero aquí

Consulte la documentación de referencia paraFirebaseInstanceIdService :

Esta clase fue obsoleta.

A favor de anular onNewTokenen FirebaseMessagingService. Una vez que se ha implementado, este servicio se puede eliminar de forma segura.

Por extraño que parezca, el JavaDoc FirebaseMessagingServiceaún no menciona el onNewTokenmétodo. Parece que todavía no se ha publicado toda la documentación actualizada. He presentado un problema interno para obtener las actualizaciones de los documentos de referencia publicados, y también para actualizar las muestras en la guía.

Mientras tanto, tanto las llamadas antiguas / en desuso como las nuevas deberían funcionar. Si tiene problemas con cualquiera de ellos, publique el código y lo echaré un vistazo.

Frank van Puffelen
fuente
77
Los documentos de Firebase tampoco se han actualizado todavía.
Rosário Pereira Fernandes
1
Sí @frank, el método existe, pero los documentos relacionados aún no se han actualizado.
Uttam Panchasara
@kev Eso suena como una nueva pregunta (válida). Cree una nueva publicación, con un fragmento de código completo mínimo.
Frank van Puffelen
@FrankvanPuffelen ya lo hizo. Echar un vistazo. stackoverflow.com/questions/51296171/…
kev
1
También encontré esta actualización para Xamarin Android. Se agregó el método OnNewToken en la clase que extiende FirebaseMessagingService. Pero ese método no es acertado. No puedo entender qué debo hacer. ¿Es diferente en el archivo de manifiesto de Android para xamarin?
Prabesh
133

FirebaseInstanceIdService está en desuso

DE DOCS: - Esta clase fue obsoleta. A favor de overriding onNewTokenen FirebaseMessagingService. Una vez que se ha implementado, este servicio se puede eliminar de forma segura.

No es necesario utilizar el FirebaseInstanceIdServiceservicio para obtener el token FCM. Puede eliminar el FirebaseInstanceIdServiceservicio de forma segura

Ahora tenemos que @Override onNewToken conseguir TokenenFirebaseMessagingService

CÓDIGO DE MUESTRA

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

EDITAR

Necesita registrar su FirebaseMessagingServicearchivo de manifiesto como este

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

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

cómo obtener un token en tu actividad

.getToken(); también está en desuso si necesita obtener un token en su actividad que Usar getInstanceId ()

Ahora necesitamos usar getInstanceId ()para generar token

getInstanceId ()Devuelve el IDtoken generado automáticamente para este Firebaseproyecto.

Esto genera una ID de instancia si aún no existe, que comienza a enviar información periódicamente al back-end de Firebase.

Devoluciones

  • Tarea que puede usar para ver el resultado a través de la InstanceIdResultcual contiene el IDy token.

CÓDIGO DE MUESTRA

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

     }
 });

EDITAR 2

Aquí está el código de trabajo para 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
fuente
1
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Samuel Liew
¿Por qué nadie muestra cómo importar FirebaseMessagingService?
temirbek
12

Y esto:

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

supongamos que es la solución de obsoleto:

FirebaseInstanceId.getInstance().getToken()

EDITAR

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() puede producir una excepción si la tarea aún no se ha completado, por lo que el método que describió Nilesh Rathod (con .addOnSuccessListener) es la forma correcta de hacerlo.

Kotlin:

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

Kotlin permite un código aún más simple que el que se muestra en otras respuestas.

Para obtener el nuevo token cada vez que se actualiza:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

Para obtener el token desde cualquier lugar en tiempo de ejecución:

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

FirebaseinstanceIdServicees obsoleto. Entonces tengo que usar "FirebaseMessagingService"

Sea la imagen por favor:

ingrese la descripción de la imagen aquí

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

En KOTLIN: - Si desea guardar el token en la base de datos o las preferencias compartidas, anule onNewToken en FirebaseMessagingService

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

Obtenga el token en tiempo de ejecución, use

FirebaseInstanceId.getInstance().instanceId
                        .addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
                            val mToken = instanceIdResult.token
                            println("printing  fcm token: $mToken")
                        }
Rahul
fuente
Ahora es override fun onNewToken(token: String)(sin el signo de interrogación).
Csaba Toth
1

Clase de implementación de 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);
 }
}
}

Y llame a initialize en Activity 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>

** Si agregó "INSTANCE_ID_EVENT" no recuerde deshabilitarlo.

Hamed Jaliliani
fuente
1

Tienes que usar en FirebaseMessagingService() lugar deFirebaseInstanceIdService

Sahil Bansal
fuente