6

Con il nuovo aggiornamento, ora verrà utilizzato FCM.Invia messaggi FCM dal lato server al dispositivo Android

Ho provato l'app di esempio da git e funziona perfettamente. Posso inviare notifiche dalla console.

Ma voglio inviare la notifica dal server dopo che un determinato evento è stato attivato. Ho seguito lo stesso approccio come in GCM ma non funziona.

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 

Am seguendo questo PHP Script per inviare la notifica. Se provo a eseguire lo script, ottengo il seguente risultato.

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

NOTA: Sono andato attraverso la loro docs e modificato il codice è succo di avere solo il corpo e il titolo. Anche allora non funziona.

+0

Potresti aggiungere il messaggio che stai inviando? Sembra che il tuo messaggio non contenga un corpo, che potrebbe essere la ragione per il puntatore nullo. –

+0

Ismael ha ragione. La mia risposta è la seguente: [http://stackoverflow.com/questions/37358462/firebase-onmessagereceived-not-called-when-app-in-background/37471326#37471326](http://stackoverflow.com/questions/37358462/firebase-onmessagereceived-not-called-when-app-in-background/37471326 # 37471326) – Koot

risposta

2

Da php gist si invia un messaggio solo dati. Il tuo ricevitore si aspetta un messaggio di notifica così quando ricevi la notifica dal messaggio remoto sarà nullo, risultando in una NPE quando chiami getBody.

Invia un messaggio di notifica e dovrebbe funzionare come previsto. Vedere i requisiti messaggio di notifica qui:. https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

+0

Sì. Quando cerco di ottenere i dati da 'remoteMessage.getData(). Get (" body ");' sto ottenendo il testo. Qualche idea su come creare una notifica lì? Il documento specifica i campi richiesti, ma come faccio a creare una notifica? – driftking9987

+0

L'oggetto dati e l'oggetto di notifica sono fratelli, quindi è possibile utilizzare i campi di notifica dei documenti per creare un oggetto di notifica allo stesso livello in cui si trovava l'oggetto dati. –

+0

Ci proverò. – driftking9987

3

al fine di ricevere la notifica utilizzando remoteMessage.getNotification() getBody(), è necessario utilizzare il set predefinito di opzioni chiave per la notifica.

In questo caso, "notifica" è la parola chiave.

La risposta JSON deve essere formattata in questo modo.

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

È possibile anche inviare una notifica e carico utile di dati nella stessa risposta JSON

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

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

2

stavo affrontando lo stesso problema e dopo aver trascorso un po 'di tempo cercando di scoprire la causa, la mia osservazione è stata -

Poiché il campo "notifica" è la rappresentazione JSON dello RemoteMessage.Notification. Se si imposta uno dei campi predefiniti della classe di notifica nel campo "notifica", sul lato client JSON viene analizzato con successo e si dispone di un valore non nullo per RemoteMessage.getNotification() su cui è possibile chiamare il getBody()/getTopic()/getIcon().

Ma se non si imposta qualsiasi campo della classe di notifica nel campo JSON "notifica", l'analisi di classe non riesce e si avrà un valore null per RemoteMessage.getNotification()

Così, una delle dopo tre JSONs è un corpo POST valida per la spinta di un RemoteMessage.Notification (oltre ai due esempi comuni di Andrea in risposta precedente), vale a dire questi tre saranno non causare la NPE sopra

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

E nessuno dei followi ng tre sono validi per la spinta di un RemoteMessage.Notification -

  1. Non ha la "notifica" campo

    { 
        "to" : "<<FIREBASE_INSTANCE_ID>>" 
    } 
    
  2. "notifica" campo è un JSON vuoto

    { 
        "to" : "<<FIREBASE_INSTANCE_ID>>", 
        "notification" : { 
        } 
    } 
    
  3. Il campo "notifica" ha alcune coppie di valori chiave, ma nessuno dei campi definiti nella classe RemoteMessage.Notification

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

Ho provato questo e ha lavorato:

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

Questo è il risultato:

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

penso che lo script sopra sia solo per l'unico utente se voglio inviare il messaggio PUSH a molti ... – techDigi

8

È possibile utilizzare questo codice completo

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

?> 

messaggio Passo e Token id come parametro per 01 Chiamata.

0

function send_fcm($tokens,$message) 
 
      { 
 

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

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

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

ID del dispositivo negozio a variabili di token in formato di array

0

Prova questo sottostante Codice questo darà spinta notication per Android dal lato server PHP e si può ottenere il token dispositivo dal Android è necessario passare dinamicamente per ottenere noticazione push per più dispositivo 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; 
} 
?>