web-dev-qa-db-ja.com

FCMメッセージをサーバー側からAndroidデバイスに送信します

新しい更新により、FCMが使用されるようになります。

Gitからサンプルアプリを試してみましたが、すべて正常に動作しています。コンソールから通知を送信できます。

しかし、特定のイベントがトリガーされた後にサーバーから通知を送信したいと思います。 GCMの場合と同じアプローチを使用しましたが、機能しません。

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

これに続いて PHPスクリプト 通知を送信します。スクリプトを実行しようとすると、次の結果が得られます。

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

注:私は彼らの docs を通過し、コードが本文とタイトルのみを持つように変更されました。それでも動作しません。

15
driftking9987

この完全なコードを使用できます

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

?>
_

sendFCM($mess,$id)呼び出しにパラメーターとしてメッセージとトークンIDを渡します。

15
php

私はこれを試して働いた:

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

これが結果です:

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

remoteMessage.getNotification()。getBody()を使用して通知を受信するには、事前定義された一連のキーオプションを通知に使用します。

この場合、 "notification"がキーワードです。

JSON応答はこのようにフォーマットする必要があります。

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

同じJSON応答で通知とデータペイロードを送信することもできます

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

これを参照してください: https://firebase.google.com/docs/cloud-messaging/concept-options#messages-with-both-notification-and-data-payloads

3

Php Gistから、データのみのメッセージを送信しています。受信者は通知メッセージを予期しているため、リモートメッセージから通知を取得するとnullになり、getBodyを呼び出すとNPEになります。

通知メッセージを送信すると、期待どおりに機能するはずです。こちらの通知メッセージの要件をご覧ください: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

2
Arthur Thompson

私は同じ問題に直面していたので、原因を突き止めようとして少し時間を費やした後、私の観察は-

「通知」フィールドは RemoteMessage.Notification のJSON表現であるため。 Notificationクラスの事前定義フィールドのいずれかを「notification」フィールドに設定すると、クライアント側でJSONが正常に解析され、RemoteMessage.getNotification() onのnull以外の値があります。 getBody()/getTopic()/getIcon()を呼び出すことができます。

ただし、「notification」jsonフィールドにNotificationクラスのフィールドを設定しない場合、クラスへの解析は失敗し、RemoteMessage.getNotification()にnull値が設定されます。

したがって、次の3つのJSONのいずれかが有効なPOSTをプッシュするためのボディRemoteMessage.Notification(以前の回答でAndreaが共有した2つの例に加えて)、つまり、これら3つは上記の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"
      }
    }

また、RemoteMessage.Notificationのプッシュには、次の3つのいずれも有効ではありません-

  1. 「通知」フィールドがありません

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>"
    }
    
  2. 「通知」フィールドは空のJSONです

    {
      "to" : "<<FIREBASE_INSTANCE_ID>>",
      "notification" : {
      }
    }
    
  3. 「通知」フィールドにはいくつかのキーと値のペアがありますが、RemoteMessage.Notificationクラスで定義されているフィールドはありません

    {
        "to" : "<<FIREBASE_INSTANCE_ID>>",
        "notification" : {
            "messageText" : "Notification Message Text",
            "messageBody" : "Notification Message Body"
        }
    }
    
2
Keshav
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;
             }

配列形式でトークン変数にデバイスIDを保存する

1
Ramya Roy