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レスポンス
{
"multicast_id":6782339717028231855,
"success":0,
"failure":1,
"canonical_ids":0,
"results":[
{
"error":"InvalidRegistration"
}
]
}
なので、上記を受け取るためのモデルを作ります。
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を使うのでアクセサは省略
}
実装
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社会で生きるための武器になりうる可能性を秘めた技術だと思いました。
ただ、端末で受け取るにはスマホアプリ開発の知識が必須になるので、ひとまずはブラウザプッシュ通知から身に着けようかな。。。
その時にはまた記事としてまとめます。
じゃあの。