15

新しいアップデートでは、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"}]}

注:私は彼らのドキュメントを調べて、本文とタイトルのみを持つようにコードの要旨を変更しました。それでもうまくいきません。

4

7 に答える 7

16

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

<?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 をパラメーターとして呼び出しに渡します。

于 2016-10-26T07:27:15.983 に答える
3

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

この場合、「通知」がキーワードです。

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

于 2016-05-27T12:56:40.173 に答える
2

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

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

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

したがって、次の 3 つの JSON のいずれも、(前の回答で Andrea によって共有された 2 つの例に加えて)プッシュするための有効な POST 本文ですRemoteMessage.Notification。つまり、これら 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"
      }
    }

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

  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"
        }
    }
    
于 2016-06-23T14:14:10.017 に答える