android - notification - messaging send firebase



Firebase(FCM) como obter token (11)

É o meu primeiro a usar o FCM.

Eu firebase/quickstart-android uma amostra do firebase/quickstart-android e instalo o FCM Quickstart. Mas não consigo obter nenhum token do log, mesmo pressionando o botão LOG TOKEN no aplicativo.

Em seguida, tento enviar mensagem com o console do Firebase e defina como destino para o nome do pacote de aplicativos. Recebi qualquer mensagem.

Quero saber se o FCM pode ser usado? O GCM está tudo bem.

Solução:

Porque eu não sou um desenvolvedor do Android, apenas um desenvolvedor de back-end. Então, levo algum tempo para resolvê-lo. Na minha opinião, há algum bug no aplicativo de exemplo.

Código:

RegistrationIntentService.java

public class RegistrationIntentService extends IntentService {

    private static final String TAG = "RegIntentService";


    public RegistrationIntentService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        String token = FirebaseInstanceId.getInstance().getToken();
        Log.i(TAG, "FCM Registration Token: " + token);
    }
}

MyFirebaseInstanceIDService.java

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";

    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */
    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
//        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//        Log.d(TAG, "Refreshed token: " + refreshedToken);
//
//        // TODO: Implement this method to send any registration to your app's servers.
//        sendRegistrationToServer(refreshedToken);
//
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }
    // [END refresh_token]

    /**
     * Persist token to third-party servers.
     * <p>
     * Modify this method to associate the user's FCM InstanceID token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
        // Add custom implementation, as needed.
    }
}

Adicione isso no MainActivity.java.

 Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);

Depois de fazer o acima, você pode obter o token no logcat. Mas, finalmente, acho uma maneira conveniente de obtê-lo. Basta usar o modo de depuração para instalar o aplicativo de amostra e você poderá obter o token na primeira vez em que o instalar.

Mas não sei t why it can imprimir o log ao instalá-lo. Talvez esteja relacionado ao sistema móvel.

E então por que não consigo receber a notificação. O FirebaseMessagingService.onMessageReceived não chamou sendNotification


Answer #1

O MAIS RÁPIDO E BOM PARA O PROTÓTIPO

A solução rápida é armazená-lo em sharedPrefs e adicionar essa lógica ao método onCreate em sua MainActivity ou classe que está estendendo o Application.

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> {
    String newToken = instanceIdResult.getToken();
    Log.e("newToken", newToken);
    getActivity().getPreferences(Context.MODE_PRIVATE).edit().putString("fb", newToken).apply();
});

Log.d("newToken", getActivity().getPreferences(Context.MODE_PRIVATE).getString("fb", "empty :("));

MANEIRA MAIS LIMPA

Uma opção melhor é criar um serviço e manter uma lógica semelhante. Primeiro, crie um novo serviço

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.e("newToken", s);
        getSharedPreferences("_", MODE_PRIVATE).edit().putString("fb", s).apply();
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
    }

    public static String getToken(Context context) {
        return context.getSharedPreferences("_", MODE_PRIVATE).getString("fb", "empty");
    }
}

E depois adicione-o ao arquivo AndroidManifest

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

Por fim, você pode usar um método estático no Service MyFirebaseMessagingService.getToken(Context);

O MAIS RÁPIDO, MAS DEPRECADO

Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());

Ele ainda está funcionando quando você está usando uma biblioteca do firebase mais antiga que a versão 17.xx


Answer #2

A equipe por trás do Firebase Android SDK altera um pouco a API. Eu implementei a lógica "Token to Server" assim:

Na minha instância do FirebaseMessagingService:

public class FirebaseCloudMessagingService extends FirebaseMessagingService {

    ...

    @Override
    public void onNewToken(String token) {
        // sending token to server here
    }

    ...

}

Lembre-se de que o token é por dispositivo e pode ser atualizado pelo Firebase, independentemente da sua lógica de login. Portanto, se você tiver a funcionalidade Login e Logout, deverá considerar casos adicionais:

  1. Quando um novo usuário efetua login, é necessário vincular o token ao novo usuário (enviá-lo ao servidor). Porque, o token pode ser atualizado durante a sessão do usuário antigo e o servidor não conhece o token do novo usuário.
  2. Quando o usuário efetua logout, é necessário desvincular o token. Porque, o usuário não deve receber mais notificações / mensagens.

Usando a nova API, você pode obter token assim:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
        @Override
        public void onSuccess(InstanceIdResult instanceIdResult) {
            String token = instanceIdResult.getToken();
            // send it to server
        }
    });

Boa sorte!


Answer #3

De acordo com doc

Migrar um aplicativo cliente do GCM para o FCM

onTokenRefresh()

Chamado apenas se o token InstanceID for atualizado

Portanto, ele será chamado apenas na primeira vez em que você instalar um aplicativo no seu dispositivo.

Por isso, sugiro que desinstale o aplicativo manualmente e tente executar novamente

definitivamente você receberá TOKEN


Answer #4

Em vez disso:

    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
//        Get updated InstanceID token.
//        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//        Log.d(TAG, "Refreshed token: " + refreshedToken);
//
//        TODO: Implement this method to send any registration to your app's servers.
//        sendRegistrationToServer(refreshedToken);
//
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }
    // [END refresh_token]

Fazem isto:

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

        // Implement this method to send token to your app's server
       sendRegistrationToServer(refreshedToken);

    }
    // [END refresh_token]

E mais uma coisa:

Você precisa chamar o método sendRegistrationToServer() que atualizará o token no servidor, se estiver enviando notificações por push do servidor.

ATUALIZAR:

Um novo token do Firebase é gerado ( onTokenRefresh() é chamado) quando:

  • O aplicativo exclui o ID da instância
  • O aplicativo é restaurado em um novo dispositivo
  • O usuário desinstala / reinstala o aplicativo
  • O usuário limpa os dados do aplicativo.

Answer #5

No firebase-messaging:17.1.0 e mais recente, o FirebaseInstanceIdService está obsoleto, é possível obter o onNewToken na classe FirebaseMessagingService conforme explicado em https://.com/a/51475096/1351469

Mas se você deseja obter o token a qualquer momento, agora pode fazê-lo assim:

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

Answer #6

O método getToken() está obsoleto. Você pode usar getInstanceId() .

Se você deseja manipular resultados ao solicitar instanceId(token) , verifique este código.

    FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(instanceIdResult -> {
    if (instanceIdResult != null) {
        String token = instanceIdResult.getToken();
        if (!TextUtils.isEmpty(token)) {
            Log.d(TAG, "retrieve token successful : " + token);
        }
    } else{
        Log.w(TAG, "instanceIdResult should not be null..");
    }
}).addOnFailureListener(e -> {
    //do something with e
}).addOnCanceledListener(() -> {
    //request has canceled
}).addOnCompleteListener(task -> Log.v(TAG, "task result : " + task.getResult().getToken()));

Answer #7

Tente isso. Por que você está usando RegistrationIntentService ?

public class FirebaseInstanceIDService extends FirebaseInstanceIdService {    
    @Override
    public void onTokenRefresh() {    
        String token = FirebaseInstanceId.getInstance().getToken();    
        registerToken(token);
    }

    private void registerToken(String token) {

    }
}

Answer #8

Você pode usar o seguinte no Firebase (FCM) para obter o token:

FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String **token** = task.getResult().getToken();

            }
        });

Answer #9

tente isso

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(OnSuccessListener<InstanceIdResult> { instanceIdResult ->
             fcm_token = instanceIdResult.token}

Answer #10

Informação importante.

se o serviço google play travou ou não está em execução, o fcm retorna o token = null

Se o serviço play estiver funcionando corretamente, o método FirebaseInstanceId.getInstance().getToken() retornará o token

Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());

Answer #11
Settings.Secure.getString(getContentResolver(),
                     Settings.Secure.ANDROID_ID);




firebase-cloud-messaging