web-dev-qa-db-fra.com

Envoyer des messages FCM côté serveur vers un périphérique Android

Avec la nouvelle mise à jour, FCM va maintenant être utilisé.

J'ai essayé l'exemple d'application de git et tout fonctionne bien. Je peux envoyer des notifications depuis la console.

Mais je veux envoyer la notification du serveur après qu'un certain événement soit déclenché. J'ai suivi la même approche que dans GCM mais cela ne fonctionne pas.

05-20 20:40:58.941 30132-30919/com.google.firebase.quickstart.fcm E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
                                                                                    Process: com.google.firebase.quickstart.fcm, PID: 30132
                                                                                    Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String com.google.firebase.messaging.RemoteMessage$Notification.getBody()' on a null object reference
                                                                                        at com.google.firebase.quickstart.fcm.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.Java:53)
                                                                                        at com.google.firebase.messaging.FirebaseMessagingService.zzo(Unknown Source)
                                                                                        at com.google.firebase.messaging.FirebaseMessagingService.zzn(Unknown Source)
                                                                                        at com.google.firebase.messaging.FirebaseMessagingService.zzm(Unknown Source)
                                                                                        at com.google.firebase.iid.zzb$2.run(Unknown Source)
                                                                                        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1113)
                                                                                        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:588)
                                                                                        at Java.lang.Thread.run(Thread.Java:818)
05-20 20:40:59.118 30132-30279/com.google.firebase.quickstart.fcm E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb9e83390

Suivez ce script PHP pour envoyer la notification. Si j'essaye d'exécuter le script, j'obtiens le résultat suivant.

{"multicast_id":4679427854122301046,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1463757518309261%31bd1c96f9fd7ecd"}]}

NOTE: Je suis passé par leurs docs et modifié le code est Gist pour avoir seulement le corps et le titre Même alors ça ne marche pas. 

14
driftking9987

Vous pouvez utiliser ce code complet

<?php

function sendFCM($mess,$id) {
$url = 'https://fcm.googleapis.com/fcm/send';
$fields = array (
        'to' => $id,
        'notification' => array (
                "body" => $mess,
                "title" => "Title",
                "icon" => "myicon"
        )
);
$fields = json_encode ( $fields );
$headers = array (
        'Authorization: key=' . "AIzaSyA9vpL9OuX6moOYw-4n3YTSXpoSGQVGnyM",
        'Content-Type: application/json'
);

$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );

$result = curl_exec ( $ch );
curl_close ( $ch );
}

?>

Transmettez le message et l'identifiant de jeton en tant que paramètre à l'appel sendFCM($mess,$id)

15
php

J'ai essayé cela et travaillé:

<?php
$ch = curl_init("https://fcm.googleapis.com/fcm/send");
$header=array('Content-Type: application/json',
"Authorization: key=GoGdfsflknEFñslknaglksjfnklj");
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{ \"notification\": {    \"title\": \"Test desde curl\",    \"text\": \"Otra prueba\"  },    \"to\" : \"SGferg-qWEFWbI:dflñkndfakllvakrgalkgjdgjslfkgjdglksdjflksjglkjlkñerhTHDFSHFZDHzdfakjsdhskjhgkjashfdasjdkf\"}");

curl_exec($ch);
curl_close($ch);
?>

Voici le résultat:

{"multicast_id":4913280949692448120,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1473389987003950%ab9a0bb6ab9a0bb6"}]}
6
Alejandro Luna

Pour recevoir la notification à l'aide de remoteMessage.getNotification (). GetBody (), vous devez utiliser le jeu de clés prédéfini pour la notification.

Dans ce cas, "notification" est le mot clé.

La réponse JSON doit être formatée comme ceci.

   {
      "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
      "notification" : {
          "body" : "great match!",
          "title" : "Portugal vs. Denmark",
          "icon" : "myicon"
      }
   }

Vous pouvez également envoyer une notification et une charge de données dans la même réponse JSON.

 {
    "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
    "notification" : {
        "body" : "great match!",
        "title" : "Portugal vs. Denmark",
        "icon" : "myicon"
    },
    "data" : {
        "Nick" : "Mario",
        "Room" : "PortugalVSDenmark"
    }
 }

voir ceci: https://firebase.google.com/docs/cloud-messaging/concept-options#messages-with-both-notification-and-data-payloads

3

Du php Gist vous envoyez un message de données seulement. Votre destinataire attend un message de notification. Ainsi, lorsque vous recevez la notification du message distant, celle-ci devient nulle, ce qui génère un NPE lorsque vous appelez getBody.

Envoyez un message de notification et cela devrait fonctionner comme prévu. Voir les exigences de notification ici: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

2
Arthur Thompson

Je faisais face au même problème et après avoir passé du temps à chercher la cause, mon observation était:

Puisque le champ "notification" est une représentation JSON du RemoteMessage.Notification . Si vous définissez l'un des champs prédéfinis de la classe Notification dans le champ "notification", JSON est analysé côté client avec succès et vous disposez d'une valeur non nulle pour RemoteMessage.getNotification() sur laquelle vous pouvez appeler le getBody()/getTopic()/getIcon().

Mais si vous ne définissez aucun champ de la classe Notification dans le champ json "notification", l'analyse de la classe échoue et vous aurez une valeur null pour RemoteMessage.getNotification().

Ainsi, l’un des trois JSON suivants est un corps POST valide pour pousser un RemoteMessage.Notification (en plus des deux exemples partagés par Andrea dans une réponse précédente), c’est-à-dire que ces trois ne causeront pas le NPE ci-dessus

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>",
      "notification" : {
          "body" : "Notification Message Body"
      }
    }

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>",
      "notification" : {
          "title" : "Notification Title"
      }
    }

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>",
      "notification" : {
          "icon" : "Notification icon"
      }
    }

Et aucun des trois suivants ne permet de pousser un RemoteMessage.Notification - 

  1. N'a pas le champ "notification"

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>"
    }
    
  2. Le champ "notification" est un json vide

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>",
      "notification" : {
      }
    }
    
  3. Le champ "notification" contient des paires de valeurs de clé, mais aucun des champs définis dans la classe RemoteMessage.Notification. 

    {
        "to" : "<<FIREBASE_INSTANCE_ID>>",
        "notification" : {
            "messageText" : "Notification Message Text",
            "messageBody" : "Notification Message Body"
        }
    }
    
2
Keshav

Essayez ce code ci-dessous cela va donner la notification Push pour Android du côté du serveur php et vous pouvez obtenir le jeton de périphérique depuis Android dont vous avez besoin de passer dynamiquement pour obtenir la notification Push pour plus d'appareils Android.

<?php
 function sendmessage_Android($devicetoken,$message){ 
        $api_key     =   'AIzaSyCtDch9K3ZqGF_SSLYCz4JjMS4-fkJuW';//get the api key from FCM backend
        $url = 'https://fcm.googleapis.com/fcm/send';
        $fields = array('registration_ids'  => array($devicetoken));//get the device token from Android 
        $headers = array( 'Authorization: key=' . $api_key,'Content-Type: application/json');
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_POST, true );
        curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($fields) );
        $result = curl_exec($ch);
        if(curl_errno($ch)){
            return 'Curl error: ' . curl_error($ch);
        }
        curl_close($ch);
        $cur_message=json_decode($result);
        if($cur_message->success==1)
            return true;
        else
            return false;
}
?>
0
Sathish Kumar VG

function send_fcm($tokens,$message)
          {

	    $url = 'https://fcm.googleapis.com/fcm/send';
	    $priority="high";
	  
	
	    $fields = array(
	         'registration_ids' =>$tokens,         
	          'data' =>$message
	           
	        );

	 
		   $headers = array(
		        'Authorization:key=your key',
		        'Content-Type: application/json'
		        );

		   $ch = curl_init();
		   curl_setopt($ch, CURLOPT_URL, $url);
		   curl_setopt($ch, CURLOPT_POST, true);
		   curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		   curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);  
		   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		   curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
		 echo  json_encode($fields);
		   $result = curl_exec($ch);           
		   curl_error($ch);
		   if ($result === FALSE)
		    {
		       die('Curl failed: ' . curl_error($ch));
   		    }
                  curl_close($ch);
                  return $result;
             }

stocker les identifiants de périphérique dans une variable de jeton dans un format de tableau

0
Ramya Roy