web-dev-qa-db-fra.com

Firebase sur Android - Je souhaite désactiver les notifications Firebase sur un client Android

J'utilise la console Firebase pour envoyer des notifications aux utilisateurs . Cependant, je souhaite laisser les utilisateurs désactiver les notifications . Comment puis-je les désactiver?

Je suis en mesure de gérer (et d'arrêter) les notifications via FirebaseMessagingService uniquement lorsque l'application est au premier plan. Mais je ne peux pas arrêter les notifications lorsque l'application est en arrière-plan.

9
martinodecarlo

Vous ne savez pas pourquoi cela vous arrive (extrait de code peut-être?), Mais il existe une solution ultime lourde: définissez votre propre récepteur c2dm dans le manifeste et définissez la priorité haute (> 0) puis arrêtez le traitement de la notification.

Les messages GCM sont traités comme des diffusions ordonnées. Vous pouvez donc arrêter la chaîne de traitement en appelant cette méthode:

https://developer.Android.com/reference/Android/content/BroadcastReceiver.html#abortBroadcast ()

Si vous ne faites rien dans votre récepteur, le prochain récepteur se chargera du traitement, à savoir le récepteur Firebase.

Remarque:: Firebase envoie une notification Push pour les modifications apportées à la configuration à distance. Ainsi, si vous utilisez la configuration à distance, il est déconseillé de supprimer les données Push.

3
racs

Je ne pouvais pas encore commenter, mais le commentaire de racs m'a beaucoup aidé.

En fait, les documents Firebase recommandent d’utiliser des données Push au lieu de notifications si vous voulez avoir un contrôle complet sur ce que c'est manipulé: firebase.google.com/docs/cloud-messaging/… - quote: "Utilisez les notifications lorsque vous souhaitez que FCM gère l'affichage d'une notification au nom du nom de votre application client. Utilisez des messages de données lorsque vous souhaitez que votre application pour gérer l'affichage ou traiter les messages sur votre client Android app ... "

Donc, fondamentalement, j'ai changé le corps de la demande de notification Push de:

{
   "data": {
       "type" : "mytype"
    },
    "notification": {
        "title": "My Title",
        "body": "My Notification Message"
    },
    "to": "/topics/all"
}

À:

{
   "data": {
       "type" : "mytype",
       "title": "My Title",
       "body": "My Notification Message"
    },
    "to": "/topics/all"
}

Maintenant, mon application appelle onMessageReceived () à chaque fois, même en arrière-plan, et je viens de changer les méthodes pour utiliser le titre et le message de notification obtenus dans les données Push.

7
Alvin Rusli

J'ai eu ce problème.et résolu par l'utilisation ci-dessous code:

Activer les notifications Firebase:

FirebaseInstanceId.getInstance().getToken();

Désactiver les notifications Firebase: deleteInstanceId () est un appel bloquant. Il ne peut pas être appelé sur le thread principal. 

FirebaseInstanceId.getInstance().deleteInstanceId();
3
Better

Vous pouvez gérer tous les événements Push de tous les services (avec Firebase). Créez d'abord YouUniversalFCM extends WakefulBroadcastReceiver

Par exemple:

public class YourUniversalFCM extends WakefulBroadcastReceiver {

    private static final String ACTION_REGISTRATION
        = "com.google.Android.c2dm.intent.REGISTRATION";
    private static final String ACTION_RECEIVE
        = "com.google.Android.c2dm.intent.RECEIVE";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        for (String key : intent.getExtras().keySet()) {
            Log.d(
                    "TAG",
                    "{UniversalFCM}->onReceive: key->"
                            + key + ", value->" + intent.getExtras().get(key)
            );
        }
        switch (action) {
            case ACTION_REGISTRATION:
                // TODO: 2016-08-06
                break;

            case ACTION_RECEIVE:
                // TODO: 2016-08-06
                break;

            default:
        }

        abortBroadcast();
    }
}

Suivant dans AndroidManifest.xml

<uses-permission Android:name="Android.permission.INTERNET"/>
<uses-permission Android:name="Android.permission.WAKE_LOCK"/>

<application
    ...>

    ...

    <receiver
        Android:name=".fcm.receivers.UniversalFCM"
        Android:permission="com.google.Android.c2dm.permission.SEND">
        <intent-filter>
            <action Android:name="com.google.Android.c2dm.intent.RECEIVE"/>
            <action Android:name="com.google.Android.c2dm.intent.REGISTRATION"/>
            <category Android:name="YOUR_PACKAGE"/>
        </intent-filter>
    </receiver>

</application>

Remplacez YOUR_PACKAGE par le package de votre application. C'est tout ... Si vous voulez vous abonner à un autre service Push, vous devez être ajouté YourTokenService

public class YourTokenService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        L.d(TokenService.class, "onTokenRefresh() Refreshed token: " + refreshedToken);
        // TODO: 2016-08-06
        super.onTokenRefresh();
    }
}

Et déclaré dans AndroidManifest.xml

<service Android:name="YourTokenService">
    <intent-filter>
        <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>
2
TarikW

Je rencontre la même question. J'utilise subscribeToTopic API pour abonner la notification.

FirebaseMessaging.getInstance().subscribeToTopic("APP");

Et je trouve l'autre API unsubscribeFromTopic pour vous désabonner.

FirebaseMessaging.getInstance().unsubscribeFromTopic("APP");

Peut-être serait-il utile pour APP d’utiliser la notification par sujet. Il ne recevrait pas de notification au premier plan et à l'arrière-plan.

1
Fantasy Fang