LoginSignup
10
10

More than 5 years have passed since last update.

SpringアプリケーションからFirebase Cloud MessagingへのPush配信

Last updated at Posted at 2017-06-04

Firebase

Googleが提供しているメッセージを無料で確実に配信するためのクロスプラットフォーム メッセージング ソリューションの事です。

先日行われたGoogle I/O 2017でも基本機能に加えて、解析系の機能で大幅改善されたようです。

今回はそんなFirebase Cloud Messaging(以下、FCM)をサーバーサイドから呼び出す際にいくつかハマるポイントがあったので、備忘録としてまとめます。

FCMとFirebase Notificationsの違い

FCM

モバイル端末やWebブラウザ等、幅広いターゲットに対して柔軟性のあるプッシュ配信を行う事が出来る仕組み。
基本的には各言語で送信処理を実装する必要がある。

Firebase Notifications

プッシュ通知をFirebaseダッシュボード上から送信することが出来る仕組み。
実装の手間がないので楽だが、シンプルなプッシュ通知しか出来ない。

今回は前者について簡単にまとめます。

リクエスト情報

  • FCMエンドポイント:https://fcm.googleapis.com/fcm/send
  • メソッド:POST
  • リクエストヘッダー:
    • Authorization: key={サーバーキー}
    • Content-Type: application/json;application/x-www-form-urlencoded;charset=UTF-8

レスポンス情報

上記の形式でHTTP通信をすると以下のようなレスポンス情報が返ってきます。
公式:FCMレスポンス

FCMレスポンス例
{
 "multicast_id":6782339717028231855,
 "success":0,
 "failure":1,
 "canonical_ids":0,
 "results":[
  {
   "error":"InvalidRegistration"
  }
 ]
}

なので、上記を受け取るためのモデルを作ります。

FirebaseResponse.java
public class FirebaseResponse 
{
    public Long multicast_id;
    public Integer success;
    public Integer failure;
    public Integer canonical_ids;
    public List<Result> results;

    class Result 
    {
        private String message_id;
        private String registration_id;
        private String error;
    }
    //lombokを使うのでアクセサは省略
}

実装

FirebaseClient.java

public class 
{
    private final String SAMPLE_MESSAGE= "{\"to\": \"xxx\",\"notification\": {\"title\": \"見出しだよ\",\"body\": \"本文だよ\"},\"data\": {\"greet\": \"Hello. World!!\"}}";
    private final String FCM_END_POINT = "https://fcm.googleapis.com/fcm/send";
    private final String SERVER_KEY = "サーバーキー";

    RestTemplate template = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    Charset utf8 = Charset.forName("UTF-8");
    MediaType mediaType = new MediaType(MediaType.APPLICATION_JSON, utf8);
    headers.setContentType(mediaType);
    headers.set( "Authorization", String.format("key=%s", SERVER_KEY) );

    HttpEntity< String > entity = new HttpEntity< String >( SAMPLE_MESSAGE, httpHeaders );

    FirebaseResponse response = template.postForObject(FCM_END_POINT , entity, FirebaseResponse.class );
    LOGGER.info(String.format("Firebase Push Result. header:[%s], message:[%s], response:[%s]", httpHeaders, SAMPLE_MESSAGE, response ));

}

こんな感じでリクエスト処理とレスポンス取得が可能になります。

端末に届いた通知の文字化け

端末に届いたプッシュ通知の日本語部分が「?????????」のように文字化けしてしまう部分でハマりました。

これは


Charset utf8 = Charset.forName("UTF-8");
MediaType mediaType = new MediaType(MediaType.APPLICATION_JSON, utf8);
headers.setContentType(mediaType);

上記を行っていなかった事が原因でした。
(公式にもしっかり書いてあります。orz)

課題

Firebase Notificationsの場合はダッシュボードから送信した通知がログとして残るので、データ解析は送信状況を簡単に把握することが出来るが、FCMの場合は送信結果しか戻ってこないので送信通知履歴管理等は独自で開発するなり考慮に入れる必要がある。

とはいってもそんなに多くの情報を持つものでもないので、負担は少ないと思う。

終わりに

Googleとしてもかなり力を入れているサービスなので、身に着けることで今後のIT社会で生きるための武器になりうる可能性を秘めた技術だと思いました。

ただ、端末で受け取るにはスマホアプリ開発の知識が必須になるので、ひとまずはブラウザプッシュ通知から身に着けようかな。。。

その時にはまた記事としてまとめます。

じゃあの。

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10