Comment gérer la notification quand app en arrière-plan dans Firebase

Voici mon manifeste

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

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

lorsque l'application est en arrière-plan et que la notification arrive, alors la notification par défaut arrive et n'exécute pas mon code de onMessageReceived .

Voici mon code onMessageReceived . Ceci appelle si mon application est en cours d'exécution sur le premier plan, pas quand app en arrière plan. Comment exécuter ce code lorsque l'application est aussi en arrière-plan?

// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
    data = remoteMessage.getData();
    String title = remoteMessage.getNotification().getTitle();
    String message = remoteMessage.getNotification().getBody();
    String imageUrl = (String) data.get("image");
    String action = (String) data.get("action");
    Log.i(TAG, "onMessageReceived: title : "+title);
    Log.i(TAG, "onMessageReceived: message : "+message);
    Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
    Log.i(TAG, "onMessageReceived: action : "+action);

    if (imageUrl == null) {
        sendNotification(title,message,action);
    } else {
        new BigPictureNotification(this,title,message,imageUrl,action);
    }
}
// [END receive_message]
281
demandé sur AL. 2016-06-08 22:18:20

21 réponses

1. Pourquoi est-ce arrivé?

il existe deux types de messages dans FCM (Firebase Cloud Messaging):

  1. Display Messages : ces messages déclenchent le rappel onMessageReceived() seulement lorsque votre application est dans premier plan
  2. Messages de Données : Ces messages déclencher le onMessageReceived() rappel même si votre application est dans premier plan/arrière plan / tué

L'équipe Firebase n'a pas encore développé D'interface utilisateur pour envoyer data-messages à vos appareils.



2. Comment?

pour ce faire, vous devez effectuer une requête POST à L'URL suivante:

POST https://fcm.googleapis.com/fcm/send

en-têtes

  • Clé: Content-Type , Valeur: application/json
  • Clé: Authorization , Valeur: key=<your-server-key>

Corps à l'aide de rubriques

{
    "to": "/topics/my_topic",
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     }
}

Ou si vous souhaitez l'envoyer aux dispositifs spécifiques

{
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     },
    "registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}



NOTE: assurez-vous d'être sans ajouter clé JSON notification

NOTE: pour obtenir votre clé de serveur, vous pouvez la trouver dans la console firebase: Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3. Comment gérer le message de notification push?

Voici comment vous traitez le message reçu:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String myCustomKey = data.get("my_custom_key");

     // Manage data
}
477
répondu Antonio 2018-07-17 11:38:27

pour faire la bibliothèque firebase pour appeler votre onMessageReceived () dans les cas suivants

  1. Application en premier plan", 151990920"
  2. Application en arrière-plan
  3. App a été tué

vous ne devez pas mettre la clé JSON 'notification' dans votre requête à l'API firebase mais utiliser 'data', voir ci-dessous.

le message suivant Ne vous appellera pas onMessageReceived () lorsque votre application est à l'arrière-plan ou tuée, et que vous ne pouvez pas personnaliser votre notification.

{
   "to": "/topics/journal",
   "notification": {
   "title" : "title",
   "text": "data!",
   "icon": "ic_notification"
    }
}

mais au lieu de cela l'utilisation de cela fonctionnera

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
} 

fondamentalement, le message est envoyé dans l'argument RemoteMessage avec votre objet de données comme Map, alors vous pouvez gérer la notification dans onMessageReceived comme dans le snippet ici

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();

     //you can get your text message here.
     String text= data.get("text");


     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        // optional, this is to make beautiful icon
             .setLargeIcon(BitmapFactory.decodeResource(
                                    getResources(), R.mipmap.ic_launcher))  
        .setSmallIcon(smallIcon)  //mandatory
      .......
    /*You can read more on notification here:
    https://developer.android.com/training/notify-user/build-notification.html
    https://www.youtube.com/watch?v=-iog_fmm6mE
    */
}
112
répondu Teerakiat Chitawattanarat 2018-04-04 12:29:32

j'ai l'impression que toutes les réponses sont incomplètes, mais toutes ont quelque chose dont vous avez besoin pour traiter une notification qui contient des données lorsque votre application est à l'arrière-plan.

suivez ces étapes et vous pourrez traiter vos notifications lorsque votre application est en arrière-plan.

1.Ajouter un filtre d'intention comme ceci:

<activity android:name=".MainActivity">
      <intent-filter>
           <action android:name=".MainActivity" />
           <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
</activity>

à une activité que vous souhaitez traiter les données de notification.

  1. envoyer les notifications avec le format suivant:

    { 
     "notification" : {
            "click_action" : ".MainActivity", 
            "body" : "new Symulti update !", 
            "title" : "new Symulti update !", 
            "icon" : "ic_notif_symulti" }, 
     "data": { ... },
     "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }
    

la clé ici est d'ajouter

"click_action" : ".MainActivity"

où .MainActivity est l'activité avec l'intention de filtre que vous avez ajouté à l'étape 1.

  1. Get "données" de l'info à partir de la notification dans le onCreate de ".Activité principale":

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //get notification data info
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
           //bundle must contain all info sent in "data" field of the notification
        }
    }
    

et cela devrait être tout ce que vous devez faire. J'espère que cela aide quelqu'un :)

61
répondu Daniel S. 2018-04-04 12:35:26

selon docs

Gérer les messages dans un backgrounded app

lorsque votre application est à l'arrière-plan, Android dirige la notification des messages sur le plateau du système. Un clic utilisateur sur la notification ouvre le app launcher par défaut.

comprend les messages qui contiennent à la fois des notifications et des données la charge utile. Dans ces cas, la notification est adressée au appareil système, et la charge utile de données est livré dans les extras de la l'intention de votre activité de lanceur.

Si vous voulez ouvrir votre application et effectuer une action spécifique, définissez click_action dans la charge utile de notification et l'associer à une intention filtre dans l'Activité que vous souhaitez lancer. Par exemple, définir click_action à OPEN_ACTIVITY_1 pour déclencher un filtre d'intention comme l'

 <intent-filter>   <action android:name="OPEN_ACTIVITY_1" />  
 <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

Edit:

basé sur ce thread :

vous ne pouvez pas définir click_action avec la Console Firebase. Vous pouvez essayer de tester avec une commande curl ou un serveur http personnalisé

curl --header "Authorization: key=<YOUR_KEY_GOES_HERE>" 
     --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send  
     -d "{\"to\":\"/topics/news\",\"notification\": 
         {\"title\": \"Click Action Message\",\"text\": \"Sample message\",
            \"click_action\":\"OPEN_ACTIVITY_1\"}}"
28
répondu Shubhank 2018-04-04 12:37:18

selon la documentation de la base de données firebase dans envoyer en aval en utilisant la base de données firebase , il y a 2 types de charge utile:

  1. données

    ce paramètre spécifie les paires clé-valeur personnalisées de la charge utile du message. Client app est responsable du traitement des messages de données. Les messages de données n'ont que des paires de valeurs clés personnalisées.

  2. notification

    ce paramètre spécifie les paires clé-valeur prédéfinies et visibles par l'utilisateur de la charge utile de notification. FCM affiche automatiquement le message vers les appareils de l'utilisateur final au nom de l'application client. Les messages de Notification ont un ensemble prédéfini de clés visibles par l'utilisateur.

lorsque vous êtes au premier plan, vous pouvez obtenir le données à L'intérieur de FCM en utilisant onMessageReceived () , vous pouvez obtenir vos données à partir de data payload.

data = remoteMessage.getData();
String customData = (String) data.get("customData");

lorsque vous êtes en arrière-plan, FCM affichera la notification dans le plateau de système basé sur l'information de notification charge utile. Le titre, le message, et l'icône qui ont utilisé pour la notification sur le plateau de système sont obtenus de la notification charge utile.

{
  "notification": {
        "title" : "title",
        "body"  : "body text",
        "icon"  : "ic_notification"
       }
}

Ce notification charge utile sont utilisés lorsque vous souhaitez automactically montrant de notification sur la barre d'état système lorsque votre application est en arrière-plan. Pour obtenir des données de notification lorsque votre application est en arrière-plan, vous devez ajouter click_action dans notification payload.

si vous souhaitez ouvrir votre application et effectuer une action spécifique [alors que backgrounded], définissez click_action dans la notification payload et de l'associer à un filtre d'intention dans l'Activité que vous souhaitez lancer. Par exemple, définissez click_action à OPEN_ACTIVITY_1 pour déclencher un filtre d'intention comme suit:

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

mettez ce filtre d'intention sur votre manifeste, dans l'étiquette de demande. Lorsque vous cliquez sur la notification, elle ouvre l'application et va directement à l'activité que vous définissez dans click_action, dans ce cas "OPEN_ACTIVTY_1". Et à l'intérieur de cette activité, vous pouvez obtenir les données par :

Bundle b = getIntent().getExtras();
String someData = b.getString("someData");

J'utilise FCM pour mon application android et j'utilise les deux charges utiles. Voici l'exemple de JSON que j'utilise:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}
17
répondu Hendy Evan 2016-08-25 15:32:04

depuis le display-messages qui sont envoyés à partir de la notification Firebase L'UI ne fonctionne que si votre application est en premier plan. Pour data-messages , il est nécessaire de faire un appel postal à FCM

Étapes

  1. Installer Advanced Rest Client Chrome Google Extension enter image description here

  2. ajouter les rubriques suivantes

    Clé : Content-Type Valeur : application/json

    clé : autorisation, valeur : clé= " clé de votre serveur" enter image description here

  3. ajouter le corps

    • Si vous utilisez les thèmes suivants :

      {
          "to" : "/topics/topic_name",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
          }
      }
      
    • si vous utilisez le numéro d'enregistrement:

      {
          "registration_ids" : "[{"id"},{id1}]",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
           }
      }
      

C'est ça!. Maintenant, écoutez onMessageReceived comme d'habitude.

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String value1 = data.get("key1");
     String value2 = data.get("key2");
}
14
répondu Anirudh Ramanan 2018-04-04 10:04:30
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}

n'est pas appelé chaque fois qu'il est appelé seulement quand app est dans forground""

il y a une méthode override cette méthode est appelée à chaque fois , peu importe ce que l'application est en avant plan ou en arrière plan ou tué, mais cette méthode est disponible avec cette version de l'api firebase

c'est la version que vous devez importer de gradle

compile 'com.google.firebase:firebase-messaging:10.2.1'

c'est la méthode

@Override
public void handleIntent(Intent intent) {
    super.handleIntent(intent);

    // you can get ur data here 
    //intent.getExtras().get("your_data_key") 


}

avec précédent api firebase cette méthode n'était pas là donc dans ce cas la base de tir se manipule quand app est en arrière-plan .... maintenant vous avez cette méthode ce que jamais tu veux faire ... vous pouvez le faire ici dans cette méthode .....

si vous utilisez la version précédente que l'activité par défaut va commencer dans ce cas, u peut obtenir des données de la même manière

if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) {
String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();

// faire ce que tu veux .... }

généralement c'est la structure du serveur que nous obtenons dans la notification

{
    "notification": {
        "body": "Cool offers. Get them before expiring!",
        "title": "Flat 80% discount",
        "icon": "appicon",
        "click_action": "activity name" //optional if required.....
    },
    "data": {
        "product_id": 11,
        "product_details": "details.....",
        "other_info": "......."
    }
}

c'est à vous de décider comment vous voulez donner cette clé de données ou vous voulez donner notification de tout ce que vous pouvez donner ....... ce que vous donnerez ici avec la même clé, vous obtiendrez ces données .........

il y a peu de cas si u r Ne pas envoyer l'action de clic dans ce cas où u va cliquer sur l'activité de défaut de notification s'ouvrira , mais si u veut ouvrir votre activité spécifique lorsque l'application est en arrière-plan u peut appeler votre activité à partir de ce sur méthode handleIntent parce que cela s'appelle chaque fois

13
répondu Avinash Jadaun 2018-04-04 12:41:02

Pour capturer le message en arrière-plan, vous devez utiliser un BroadcastReceiver

public class FirebaseDataReceiver extends WakefulBroadcastReceiver {

    private final String TAG = "FirebaseDataReceiver";

    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "I'm in!!!");
        Bundle dataBundle = intent.getBundleExtra("data");
        Log.d(TAG, dataBundle.toString());
    }
}

et ajoutez ceci à votre manifeste:

<receiver
      android:name="MY_PACKAGE_NAME.FirebaseDataReceiver"
      android:exported="true"
      android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
</receiver>
12
répondu Romulano 2018-04-04 10:08:16

Voici des concepts plus clairs sur le message firebase. Je l'ai trouvé dans leur équipe de soutien.

Firebase a trois types de message :

messages de Notification : le message de Notification fonctionne sur l'arrière-plan ou l'avant-plan. Quand app est en arrière-plan, les messages de Notification sont livrés au plateau du système. Si l'application est au premier plan, les messages sont traités par onMessageReceived() ou didReceiveRemoteNotification rappel. Il s'agit essentiellement de ce qu'on appelle des messages D'affichage.

messages de données : sur la plate-forme Android, les messages de données peuvent fonctionner sur l'arrière-plan et l'avant-plan. Le message de données sera traité par onMessageReceived(). Une note spécifique à la plate-forme ici serait: sur Android, la charge utile de données peut être récupérée dans l'intention utilisée pour lancer votre activité. Pour élaborer, si vous avez "click_action":"launch_Activity_1" , vous pouvez récupérer cette intention par getIntent() à partir de seulement Activity_1 .

Messages avec à la fois notification et charges utiles de données : en arrière-plan, les applications reçoivent la charge utile de notification dans le plateau de notification, et ne gèrent la charge utile de données que lorsque l'utilisateur tape sur la notification. Au premier plan, votre application reçoit un objet message avec les deux charges utiles disponibles. Deuxièmement, le paramètre click_action est souvent utilisé dans la charge de notification et non dans la charge de données. Si utilisé à l'intérieur d' charge utile de données, ce paramètre serait traité comme une paire clé-valeur personnalisée et donc vous auriez besoin d'implémenter une logique personnalisée pour qu'elle fonctionne comme prévu.

en outre, je vous recommande d'utiliser la méthode onMessageReceived (voir message de données) pour extraire le faisceau de données. D'après votre logique, j'ai vérifié l'objet bundle et je n'ai pas trouvé le contenu des données attendues. Voici une référence à un cas similaire qui pourrait apporter plus de clarté.

pour plus d'info visitez mon ce fil

8
répondu Md. Sajedul Karim 2017-05-23 11:47:31

2017 Mise à jour de la réponse

Voici une réponse claire de la docs concernant ceci:

enter image description here

7
répondu pulp_fiction 2017-06-28 20:29:47

selon les documents: 17 mai 2017

Lorsque votre application est dans le arrière-plan , Android dirige les messages de notification vers le plateau du système. Un utilisateur tape sur le notification ouvre le App launcher par défaut .

comprend les messages qui contiennent à la fois notification et données charge utile (et tous les messages envoyés depuis la console des Notifications). Dans ils dans les cas où la notification est envoyée au plateau du système de l'appareil, et la charge utile de données est livré dans les extras de l'intention de votre lanceur d'Activité.

vous devez donc utiliser les deux notifications de charge utile + données:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

Il n'est pas nécessaire d'utiliser click_action.Vous devriez juste obtenir des exras de l'intention sur activité de lanceur

<activity android:name=".MainActivity">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

le code Java doit être sur méthode onCreate sur L'activité principale:

Intent intent = getIntent();
if (intent != null && intent.getExtras() != null) {
    Bundle extras = intent.getExtras();
    String someData= extras.getString("someData");
    String someData2 = extras.getString("someData2");
}

vous pouvez tester à la fois la notification de charge utile et les données de la Console de notification Firebase Notifications . N'oubliez pas de remplir des champs de données personnalisés sur la section des options avancées

6
répondu Mihuilk 2018-04-04 12:42:30

j'ai compris les scénarios,

quand app est dans premier plan , onMessageReceived () method is called from the FirebaseService .Ainsi ,le pendingIntent défini dans la classe de service sera appelé.

et quand app est dans background , première activité est appelé.

maintenant, si vous utilisez une activité splash , alors doit gardez à l'esprit la activité Splash sera appelé, sinon s'il n'y a pas d'activité splash, alors quelle que soit la première activité, sera appelé.

ensuite, vous devez cocher getIntent () de la first activity pour voir si elle a un bundle .si tout est correct, vous verrez bundle est là avec les valeurs remplies. Si la valeur dans étiquette de données envoyé du serveur ressemble à ceci,

"data": {
    "user_name": "arefin sajib",
    "value": "user name notification"
  }

, Puis dans la première activité, vous verrez, il y a une intention valide( getIntent() n'est pas null ) , paquet valide et paquet intérieur , il y aura le JSON entier mentionné ci-dessus avec données comme clé .

pour ce scénario, code pour l'extraction de la valeur ressemblera à ceci,

    if(getIntent()!=null){
            Bundle bundle = getIntent().getExtras();
            if (bundle != null) {
                try {
                   JSONObject object = new JSONObject(bundle.getStringExtra("data"));
String user_name = object.optString("user_name");

                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }
        }
5
répondu Shamsul Arefin Sajib 2018-01-02 04:55:38

résumé Simple comme ceci

  • si votre application est en cours d'exécution;

    onMessageReceived()
    

est déclencheur.

  • si votre application n'est pas en cours d'exécution (tué par swiping);

    onMessageReceived()
    

n'est pas déclenché et livré par direclty. Si vous avez une paire de clés-valeur spéciale. Ils ne' t de travail en raison de l' onMessageReceived() ne fonctionne pas.

j'ai trouvé ce chemin;

dans votre activité de lanceur, mettez cette logique,

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState, R.layout.activity_splash);

    if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) {

        // do what you want

        // and this for killing app if we dont want to start
        android.os.Process.killProcess(android.os.Process.myPid());

    } else {

        //continue to app
    }
}

dans ce bloc if, cherchez vos clés selon firebase UI.

dans cet exemple, ma clé et ma valeur comme ci-dessus; (désolé pour la langue =)) enter image description here

Quand mon code fonctionne, je reçois "com.rda.Note."

android.os.Process.killProcess(android.os.Process.myPid());

avec cette ligne de code, j'ai fermé mon application et ouvert Google Play Market""

amusez-vous bien =)

4
répondu Arda 2016-10-19 11:26:19

supprimer la charge utile de notification complètement de votre demande de serveur. Envoyer seulement les données et le gérer dans onMessageReceived() , sinon votre onMessageReceived ne sera pas déclenché lorsque l'application est en arrière-plan ou tué.

voici ce que j'envoie du serveur:

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......"
}

pour que vous puissiez recevoir vos données dans onMessageReceived(RemoteMessage message) comme ceci: (disons que je dois obtenir l'id)

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }

et de même vous pouvez obtenir n'importe quelles données que vous avez envoyées du serveur dans onMessageReceived() .

2
répondu Zohab Ali 2016-10-17 11:59:44

la façon facile d'envoyer des messages, même si l'application est en arrière-plan et en premier plan comme suit:- Pour envoyer un message à L'aide de L'API, vous pouvez utiliser un outil appelé AdvancedREST Client, son extension chrome, et envoyer un message avec les paramètres suivants.

Reste l'outil client Lien: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

utilisez cette url:- https://fcm.googleapis.com/fcm/send Content-Type:application / json Autorisation: clé=clé de votre serveur ou clé D'authentification (voir ci-dessous ref)

{ "data": {
    "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg",
    "message": "Firebase Push Message Using API"
    "AnotherActivity": "True"
     },
  "to" : "device id Or Device token"
}
Vous pouvez obtenir la clé D'autorisation

en visitant la Google developers console et en cliquant sur le bouton "Credentials" dans le menu de gauche de votre projet. Parmi les clés API listées, la clé du serveur sera votre clé d'autorisation.

et vous devez mettre tokenID du récepteur dans la section "à" de votre demande envoyée par API.

2
répondu Syed Danish Haider 2018-04-04 12:43:45

merci à tous pour vos réponses. Mais j'ai résolu cela en envoyant message de données au lieu d'envoyer Notification . Code du serveur

<?php
$url = "https://fcm.googleapis.com/fcm/send";
$token = "C-l6T_a7HouUK****";
$serverKey = "AAAAaOcKS00:********";
define( 'API_ACCESS_KEY', $serverKey );
$registrationIds = array($token);
// prep the bundle

$msg = array

(
 'message'  => 'here is a message. message',
 'title'        => 'This is a title. title',
 'subtitle' => 'This is a subtitle. subtitle',
 'tickerText'   => 'Ticker text here...Ticker text here...Ticker text 
 here',
 'vibrate'  => 1,
 'sound'        => 1,
 'largeIcon'    => 'large_icon',
 'smallIcon'    => 'small_icon'

);

$fields = array

(
  'registration_ids'    => $registrationIds,
  'data'            => $msg

);
$headers = array

(
  'Authorization: key=' . API_ACCESS_KEY,
 'Content-Type: application/json'

);


$ch = curl_init();

curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' 
);

curl_setopt( $ch,CURLOPT_POST, true );

curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );

curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );

curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );

$result = curl_exec($ch );

curl_close( $ch );

echo $result;

?>

et a saisi les données dans unmessagereception

public class MyFirebaseMessagingService extends FirebaseMessagingService     {

  private static final String TAG = "MyFirebaseMsgService";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

      sendNotification(remoteMessage.getData().get("message"));
     }
   // Check if message contains a notification payload.
    else if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    sendNotification(remoteMessage.getNotification().getBody());
    }


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

    String channelId = "idddd";
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(MyFirebaseMessagingService.this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("FCM Message")
                    .setContentText(messageBody)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

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

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
2
répondu Android Sanaullah 2018-06-25 12:09:54

Juin 2018 Réponse -

vous devez vous assurer qu'il n'y a pas de mot clé" notification " dans le message. Incluez seulement "données", et l'application sera en mesure de gérer le message dans onMessageReceived, même si en arrière-plan ou tué.

Utilisant Les Fonctions De Nuage:

const message = {
    token: token_id,   // obtain device token id by querying data in firebase
    data: {
       title: "my_custom_title",
       body:  "my_custom_body_message"
       }
    }


return admin.messaging().send(message).then(response => {
    // handle response
});

puis dans votre onMessageReceived (), dans votre classe d'extension COM.Google.firebase.de messagerie.FirebaseMessagingService:

if (data != null) {
  Log.d(TAG, "data title is: " + data.get("title");
  Log.d(TAG, "data body is: " + data.get("body");
}

// build notification using the body, title, and whatever else you want.
1
répondu Jeff Padgett 2018-06-26 03:29:48

en utilisant ce code, vous pouvez obtenir la notification en arrière-plan / premier plan et aussi mettre l'action:

//Data should come in this format from the notification
{
  "to": "/xyz/Notifications",
  "data": {
      "key1": "title notification",
      "key2": "description notification"
  }
}

In-App, utilisez ce code:

  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
      String key1Data = remoteMessage.getData().get("key1");
      // use key1Data to according to your need
    }
1
répondu Ashish Kumar 2018-09-20 07:58:00

vous voulez travailler surmessagereceived(RemoteMessage remoteMessage) en arrière-plan envoyer seulement la partie notification de données partie ceci:

"data":    "image": "",    "message": "Firebase Push Message Using API", 

"AnotherActivity": "True", les "pour" : "id de l'appareil Ou le Dispositif de jeton"

par cette onMessageRecivied est appel arrière-plan et premier plan Pas besoin de traiter la notification en utilisant le plateau de notification sur votre activité de lanceur. Gérer la charge utile de données en utilisant ceci:

public void onMessageReceived (RemoteMessage remoteMessage) si (remoteMessage.getData ().taille() > 0) Journal.d (balise, "Message data payload:" + remoteMessage.getData ());

1
répondu user3385125 2018-10-12 09:36:20

En plus des réponses ci-dessus, Si vous testez des notifications push en utilisant FCM console , la clé 'data' et l'objet est et non ajoutés au paquet de Notification Push. Ainsi, vous ne recevrez pas de notification push détaillée lorsque L'application est en arrière-plan ou tuée.

dans ce cas, vous devez opter pour votre console d'administration arrière-plan pour tester le scénario D'arrière-plan de L'application.

ici, vous aurez ajouté la clé 'data' à votre pousser bundle. ainsi, push détaillé sera affiché comme prévu. Espérons que cela aide peu.

0
répondu Max Droid 2018-08-27 17:29:03

j'ai connu le même problème et j'ai recompilé la bibliothèque firebase et l'ai empêchée d'envoyer des notifications lorsque l'application est à l'arrière-plan

* bibliothèque https://github.com/erdalceylan/com-google-firebase-messaging

 dependencies {
        compile 'com.google.firebase:firebase-core:11.2.0'
        compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0'
    }

*

@WorkerThread
public void onMessageReceived(RemoteMessage var1) {
  //your app is in background or foreground all time calling
}

espoir aide. Bonne chance

-3
répondu Erdal CEYLAN 2017-09-26 07:29:55