FirebaseInstanceIdService está obsoleto

223

Espero que todos vocês estejam cientes dessa classe, usada para obter o token de notificação sempre que o token de notificação do firebase foi atualizado, obtemos o token atualizado dessa classe, Do seguinte método.

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

Para usar isso como desejo implementar o FCM, estendi o MyClass de FirebaseInstanceIdService

Mas, Mostrando que o FirebaseInstanceIdService está obsoleto

Alguém sabe disso ?, Qual método ou classe devo usar em vez disso para obter um token atualizado, pois isso foi preterido.

Estou a usar : implementation 'com.google.firebase:firebase-messaging:17.1.0'

Eu verifiquei o documento para o mesmo, não há nada mencionado sobre isso. : DOCUMENTO DE CONFIGURAÇÃO DO FCM


ATUALIZAR

Este problema foi corrigido.

Como o Google reprovou FirebaseInstanceService,

Fiz a pergunta para encontrar o caminho e eu sei que podemos obter o token do FirebaseMessagingService ,

Como antes, quando perguntei que os documentos de pergunta não eram atualizados, mas agora os documentos do Google foram atualizados, para obter mais informações, consulte este documento do google: FirebaseMessagingService

ANTIGO De: FirebaseInstanceService (descontinuado)

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

NOVO De: FirebaseMessagingService

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

Obrigado.

Uttam Panchasara
fonte
1
Postagens cruzadas no GitHub
Rosário Pereira Fernandes
Aqui também: medium.com/android-school/…
Pratik Butani
a documentação online é atualizada. firebase.google.com/docs/reference/android/com/google/firebase/...
jackycflau
É necessário / correto ligar super.onNewToken(s);? (Não vejo isso sendo chamado em firebase.google.com/docs/cloud-messaging/android/client .) #
-Ban-
haveria alguma mudança no manifesto?
Muahmmad Tayyib

Respostas:

122

firebaser aqui

Verifique a documentação de referência paraFirebaseInstanceIdService :

Esta classe foi preterida.

Em favor de substituir onNewTokenno FirebaseMessagingService. Uma vez implementado, esse serviço pode ser removido com segurança.

Curiosamente, o JavaDoc para FirebaseMessagingServiceainda não menciona o onNewTokenmétodo. Parece que nem toda a documentação atualizada foi publicada ainda. Arquivei um problema interno para publicar as atualizações dos documentos de referência e também para atualizar os exemplos no guia.

Enquanto isso, as chamadas antigas / obsoletas e as novas devem funcionar. Se você estiver com problemas, publique o código e eu darei uma olhada.

Frank van Puffelen
fonte
7
Os documentos do Firebase também não foram atualizados ainda.
Rosário Pereira Fernandes
1
Sim @frank, o método existe, mas os documentos relacionados ainda não foram atualizados.
Uttam Panchasara
@ kev Parece uma nova pergunta (válida). Crie uma nova postagem, com um snippet de código completo mínimo.
Frank van Puffelen
@FrankvanPuffelen já o fez. Dar uma olhada. stackoverflow.com/questions/51296171/…
kev
1
Também descobri esta atualização para o Xamarin Android. Adicionado o método OnNewToken na classe que estende o FirebaseMessagingService. Mas esse método não é atingido. Não consigo descobrir o que devo fazer. É diferente no arquivo de manifesto do Android para xamarin.
Prabesh
133

Sim FirebaseInstanceIdService está obsoleto

FROM DOCS: - Esta classe foi preterida. A favor de overriding onNewTokenin FirebaseMessagingService. Uma vez implementado, esse serviço pode ser removido com segurança.

Não é necessário usar o FirebaseInstanceIdServiceserviço para obter o token FCM Você pode remover o FirebaseInstanceIdServiceserviço com segurança

Agora precisamos @Override onNewToken começar TokenemFirebaseMessagingService

CÓDIGO DE AMOSTRA

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

Você precisa registrar seu FirebaseMessagingServicearquivo de manifesto como este

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

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

como obter token em sua atividade

.getToken(); também será descontinuado se você precisar obter um token em sua atividade que Usar getInstanceId ()

Agora precisamos usar getInstanceId ()para gerar token

getInstanceId ()Retorna o IDtoken gerado automaticamente para este Firebaseprojeto.

Isso gera um ID da instância, se ainda não existir, que inicia o envio periódico de informações ao back-end do Firebase.

Devoluções

  • Tarefa que você pode usar para ver o resultado através do InstanceIdResultqual mantém o IDe token.

CÓDIGO DE AMOSTRA

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

Aqui está o código de trabalho para o 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
fonte
1
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Samuel Liew
por que ninguém mostra como importar o FirebaseMessagingService?
temirbek 20/03
12

E isto:

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

suponha que seja uma solução obsoleta:

FirebaseInstanceId.getInstance().getToken()

EDITAR

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() pode gerar exceção se a tarefa ainda não estiver concluída, portanto, o método descrito por Nilesh Rathod (com .addOnSuccessListener ) é a maneira correta de fazer isso.

Kotlin:

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

O Kotlin permite um código ainda mais simples do que o mostrado em outras respostas.

Para obter o novo token sempre que for atualizado:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

Para obter o token de qualquer lugar no tempo de execução:

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

FirebaseinstanceIdServiceestá obsoleto. Então, tem que usar "FirebaseMessagingService"

Mar a imagem por favor:

insira a descrição da imagem aqui

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

No KOTLIN: - Se você deseja salvar o token no DB ou preferências compartilhadas, substitua onNewToken no FirebaseMessagingService

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

Obter token em tempo de execução, use

FirebaseInstanceId.getInstance().instanceId
                        .addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
                            val mToken = instanceIdResult.token
                            println("printing  fcm token: $mToken")
                        }
Rahul
fonte
Agora é override fun onNewToken(token: String)(sem o ponto de interrogação).
Csaba Toth
1

Classe de implementação do 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 chame sua inicialização em 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>

** Se você adicionou "INSTANCE_ID_EVENT", não se esqueça de desativá-lo.

Hamed Jaliliani
fonte
1

Você tem que usar em FirebaseMessagingService() vez deFirebaseInstanceIdService

Sahil Bansal
fonte