6

Po wprowadzeniu nowej aktualizacji zostanie użyty moduł FCM.Wysyłaj komunikaty FCM od strony serwera do urządzenia z systemem Android

Próbowałem aplikacji przykładowej z git i działa dobrze. Mogę wysyłać powiadomienia z konsoli.

Ale chcę wysłać powiadomienie z serwera po uruchomieniu określonego zdarzenia. Postępowałem zgodnie z tym samym podejściem, jak w GCM, ale to nie działa.

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 

Podążam za tym PHP Script, aby wysłać powiadomienie. Jeśli spróbuję wykonać skrypt, otrzymam następujący wynik.

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

UWAGA: Przeszedłem ich docs i modyfikować kod jest sens mieć tylko ciało i tytuł. Nawet wtedy to nie działa.

+0

Czy możesz dodać wiadomość, którą wysyłasz? Wygląda na to, że twoja wiadomość nie zawiera ciała, które może być przyczyną zerowego wskaźnika. –

+0

Ismael ma rację. Niniejszym moja odpowiedź: [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

Odpowiedz

2

Z poziomu php wysyłamy wiadomość zawierającą tylko dane. Odbiornik oczekuje wiadomości z powiadomieniem, więc gdy otrzymasz powiadomienie ze zdalnej wiadomości, będzie ona pusta, co spowoduje NPE podczas wywołania getBody.

Wyślij wiadomość z powiadomieniem i powinna działać zgodnie z oczekiwaniami. Zobacz wymagania wiadomość zgłoszenie tutaj. https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

+0

Tak. Kiedy próbuję uzyskać dane przez 'remoteMessage.getData(). Get (" body ");' otrzymuję tekst. Masz pomysł, jak utworzyć tam powiadomienie? Dokument określa wymagane pola, ale jak utworzyć "powiadomienie"? – driftking9987

+0

Obiekt danych i obiekt powiadomienia to rodzeństwo, więc możesz użyć pól powiadomień z dokumentów, aby utworzyć obiekt powiadomienia na tym samym poziomie, co obiekt danych. –

+0

Spróbuję tego. – driftking9987

3

Aby otrzymywać powiadomienia za pomocą remoteMessage.getNotification() getBody(), trzeba użyć klucza predefiniowany zestaw opcji powiadamiania.

W tym przypadku kluczowym słowem jest "powiadomienie" "powiadomienie".

Odpowiedź JSON musi być sformatowana w ten sposób.

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

Możesz też wysłać zgłoszenie i ładunek danych w tej samej odpowiedzi JSON

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

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

2

byłem stoi ten sam problem i po spędzeniu pewnego czasu próbuje dowiedzieć się, Przyczyna, moja obserwacja była -

Ponieważ "powiadomienie" pole jest JSON reprezentacja RemoteMessage.Notification. Jeśli którakolwiek z predefiniowanych pól klasy powiadomienie na „zgłoszenie” polu, na stronie klienta JSON pomyślnie analizowany i masz niezerową wartość dla RemoteMessage.getNotification() na której można wywołać getBody()/getTopic()/getIcon().

Ale jeśli nie ustawić dowolne pole klasy powiadomień w „powiadomień” pola json, parsowanie do klasy zawiedzie i będzie mieć wartość null dla RemoteMessage.getNotification()

Tak, każdy z następujące trzy JSONs jest ważne dla ciała POST pcha RemoteMessage.Notification (w uzupełnieniu do dwóch przykładów udostępnionych przez Andrea wcześniejszą odpowiedź), czyli te trzy nie spowoduje powyższy NPE

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

a żaden z followi ng trzy są ważne przez pchanie RemoteMessage.Notification -

  1. nie ma "powiadomienia" field

    { 
        "to" : "<<FIREBASE_INSTANCE_ID>>" 
    } 
    
  2. "powiadomienia" pole jest pusty JSON

    { 
        "to" : "<<FIREBASE_INSTANCE_ID>>", 
        "notification" : { 
        } 
    } 
    
  3. Pole "powiadomienie" zawiera kilka par wartości klucza, ale żadne z pól zdefiniowanych w RemoteMessage.Notification class

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

Próbowałem tego i pracował:

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

Jest to wynikiem:

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

Myślę, że powyższy skrypt jest tylko dla jednego użytkownika, jeśli chcę wysłać wiadomość PUSH do wielu ... – techDigi

8

Możesz użyć tej kompletny kod

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

?> 

wiadomość mijają a żeton id jako parametr do sendFCM($mess,$id) połączenie.

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

identyfikatory przechowywać urządzenia w zmiennej token w formie tablicy

0

Spróbuj poniżej kod to da Push notication dla Androida od strony serwera php i można dostać token urządzenia z Android potrzebujesz dynamicznie przekazywać powiadomienia, aby uzyskać więcej urządzeń z Androidem.

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