web-dev-qa-db-fra.com

Notification push ne fonctionne pas correctement lorsque l'application est sur le fond ou ne fonctionne pas

J'utilise Firebase Cloud Messaging pour envoyer des notifications Push.

Voici mon FirebaseMessageService:

public class FireBaseMessageService extends FirebaseMessagingService {


@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.e("TAG", "From: " + remoteMessage.getFrom());
    Log.e("TAG", "Notification Message Body: " + remoteMessage.getData().get("CardName")+"  :  "+remoteMessage.getData().get("CardCode"));
    sendNotification(remoteMessage.getNotification().getBody());
}


private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, StartActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher_final)
            .setContentTitle("Notification")
            .setContentText(messageBody)
            .setTicker("Test")
            .setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_SOUND)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

Et FirebaseInstanceServer:

public class FirebaseInstanceService extends FirebaseInstanceIdService {


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

    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);

}

private void sendRegistrationToServer(String token) {


      // Add custom implementation, as needed.
        Log.e("TAG", "Refreshed token2: " + token);
    }
}

Qui est déclaré dans le AndroidManifest:

<service
    Android:name=".util.notifications.FireBaseMessageService">
    <intent-filter>
        <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<service
    Android:name=".util.notifications.FirebaseInstanceService">
    <intent-filter>
        <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

Le problème est que lorsque App est en cours d'exécution, ticker est bien affiché et que la notification est accompagnée d'un son par défaut, mais lorsque App est en arrière-plan ou n'est pas en cours d'exécution, la notification est sans son et que ticker ne s'affiche pas. dans la barre d'état.
Pourquoi cela se produit-il et comment puis-je le réparer?

30
Ololoking

Avec FCM, vous spécifiez une charge utile POST à envoyer à https://fcm.googleapis.com/fcm/send. Dans cette charge, vous pouvez spécifier une clé data ou notification, ou les deux.

Si votre charge contient uniquement une clé data, votre application gérera elle-même tous les messages Push. Par exemple. ils sont tous livrés à votre gestionnaire onMessageReceived.

Si votre charge contient une clé notification, votre application gérera les messages Push elle-même uniquement si votre application est active/au premier plan. Si ce n'est pas le cas (c'est donc en arrière-plan ou entièrement fermé), FCM gère l'affichage de la notification pour vous en utilisant les valeurs que vous avez entrées dans la charge notification de la clé.

Notez que les notifications envoyées depuis une console (comme la console Firebase) incluent toujours une clé notification.

On dirait que vous voulez gérer vous-même les messages FCM afin de pouvoir personnaliser la notification un peu plus, il serait donc préférable de ne pas inclure la clé notification dans le POST payload, donc tous les messages Push sont remis à votre onMessageReceived.

Vous pouvez en lire plus à ce sujet ici:
Options de messagerie avancées
syntaxe de message en aval

67
Tim Castelijns

J'ai passé deux semaines à comprendre pourquoi mon application ne peut plus recevoir de message de données lorsqu'elle est en arrière-plan et aussi étrange que cela puisse être, je suis parvenue à la conclusion qu'Android-Studio 2.1.2 était le problème!

Je ne peux plus recevoir de message FCM dans l'application d'arrière-plan

https://github.com/firebase/quickstart-Android/issues/89

2
fralbo