新しい更新により、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 を通過し、コードが本文とタイトルのみを持つように変更されました。それでも動作しません。
この完全なコードを使用できます
_<?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を渡します。
私はこれを試して働いた:
<?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"}]}
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
Php Gistから、データのみのメッセージを送信しています。受信者は通知メッセージを予期しているため、リモートメッセージから通知を取得するとnullになり、getBodyを呼び出すとNPEになります。
通知メッセージを送信すると、期待どおりに機能するはずです。こちらの通知メッセージの要件をご覧ください: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
私は同じ問題に直面していたので、原因を突き止めようとして少し時間を費やした後、私の観察は-
「通知」フィールドは 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つのいずれも有効ではありません-
「通知」フィールドがありません
{
"to" : "<<FIREBASE_INSTANCE_ID>>"
}
「通知」フィールドは空のJSONです
{
"to" : "<<FIREBASE_INSTANCE_ID>>",
"notification" : {
}
}
「通知」フィールドにはいくつかのキーと値のペアがありますが、RemoteMessage.Notificationクラスで定義されているフィールドはありません
{
"to" : "<<FIREBASE_INSTANCE_ID>>",
"notification" : {
"messageText" : "Notification Message Text",
"messageBody" : "Notification Message Body"
}
}
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を保存する