webentwicklung-frage-antwort-db.com.de

Senden Sie FCM-Nachrichten von der Serverseite an das Android-Gerät

Mit dem neuen Update wird nun FCM verwendet.

Ich habe die Beispiel-App von git ausprobiert und sie funktioniert einwandfrei. Ich kann Benachrichtigungen von der Konsole aus senden.

Ich möchte jedoch die Benachrichtigung vom Server senden, nachdem ein bestimmtes Ereignis ausgelöst wurde. Ich habe den gleichen Ansatz wie in GCM verfolgt, aber es funktioniert nicht.

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

Folge diesem PHP Script , um die Benachrichtigung zu senden. Wenn ich versuche, das Skript auszuführen, erhalte ich folgendes Ergebnis.

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

HINWEIS: Ich habe ihre docs durchgearbeitet und den Code in Gist so geändert, dass er nur Text und Titel enthält. Selbst dann funktioniert es nicht. 

14
driftking9987

Sie können diesen vollständigen Code verwenden

<?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 );
}

?>

Übergeben Sie die Nachricht und die Token-ID als Parameter an den Aufruf sendFCM($mess,$id)

15
php

Ich habe das ausprobiert und gearbeitet:

<?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);
?>

Das ist das Ergebnis:

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

Um die Benachrichtigung mit remoteMessage.getNotification (). GetBody () zu erhalten, müssen Sie die vordefinierte Schlüsseloption für die Benachrichtigung verwenden.

In diesem Fall ist "notification" das Schlüsselwort.

Die JSON-Antwort muss so formatiert sein.

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

Sie können auch Benachrichtigung und Datennutzlast in derselben JSON-Antwort senden

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

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

3

Von der php Gist aus senden Sie eine Nur-Daten-Nachricht. Ihr Empfänger erwartet eine Benachrichtigungsnachricht. Wenn Sie eine Benachrichtigung von der Remote-Nachricht erhalten, ist diese leer, was zu einem NPE führt, wenn Sie getBody anrufen.

Senden Sie eine Benachrichtigung, und es sollte wie erwartet funktionieren. Die Anforderungen für Benachrichtigungen finden Sie hier: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

2
Arthur Thompson

Ich war mit dem gleichen Problem konfrontiert und nachdem ich einige Zeit damit verbracht hatte, die Ursache herauszufinden, war meine Beobachtung

Da das Feld "Benachrichtigung" eine JSON-Darstellung der RemoteMessage.Notification ist. Wenn Sie eines der vordefinierten Felder der Benachrichtigungsklasse im Feld "Benachrichtigung" festlegen, wird der JSON auf Clientseite erfolgreich analysiert, und Sie haben einen Wert ungleich Null für RemoteMessage.getNotification(), mit dem Sie das aufrufen können getBody()/getTopic()/getIcon().

Wenn Sie jedoch kein Feld der Benachrichtigungsklasse im json-Feld "notification" festlegen, schlägt die Analyse in class fehl und Sie haben einen Nullwert für RemoteMessage.getNotification().

Daher ist eine der folgenden drei JSONs ein gültiger POST - Body, um einen RemoteMessage.Notification zu drücken (zusätzlich zu den beiden Beispielen, die Andrea in der vorherigen Antwort geteilt hat), d. H

    {
      "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"
      }
    }

Und keine der folgenden drei ist für das Pushing einer RemoteMessage gültig.Notification - 

  1. Hat das Feld "Benachrichtigung" nicht

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>"
    }
    
  2. "Benachrichtigungsfeld" ist ein leerer Json

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>",
      "notification" : {
      }
    }
    
  3. Das Feld "notification" enthält einige Schlüsselwertpaare, jedoch keines der in der Klasse RemoteMessage.Notification definierten Felder 

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

Verwenden Sie den folgenden Code, um Push-Benachrichtigungen für Android von PHP-Serverseite aus zu erhalten. Sie können das von Android benötigte Gerätetoken dynamisch erhalten, um Push-Benachrichtigungen für mehr Android-Geräte zu erhalten.

<?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

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;
             }

speichern Sie Geräte-IDs in Token-Variablen in einem Array-Format

0
Ramya Roy