FCMでPUSH通知を実装した話


株式会社レスキューナウの新プロダクトチームでバックエンドエンジニアを担当している室伏です。
最近、PUSH通知を実装する機会がありましたので、それについて書いてみます。
(デバイストークンを取得済みの状態で、インフラの準備が終わっている前提の話となります)


使用したサービスについて

PUSH通知を送信する際に、下記のようなサービスが存在し、今回のチームではFCMを採用しました。

  • Firebase Cloud Messaging (FCM)

  • Amazon SNS

  • Amazon Pinpoint

  • BoltzEngine


苦労した事

まだ開発中の段階ですが、簡単なPUSH通知の送信は、検証フェーズで完了していたので、そこまで苦労はありませんでした。
しいていえば、実機にアプリをインストールして、デバイストークンを取得するための準備が大変でした。


他サービスとの違い

以前に、BoltzEngine(BoltzEngine CSV)を使用した事がありましたので、実際に実装した上で、感じたことをまとめます。

  • 前回:Java + BoltzEngine CSV

  • 今回:Golang + FCM(firebase.google.com/go/v4)


・タイトルとメッセージ以外を送れる


FCMだとタイトルとメッセージ以外にも任意の値が入れられる。
BoltzEngine CSVの方は、テキストメッセージを通知するために使うものとなります。


・送信に必要なのもの


BoltzEngine CSV は、その名の通り、CSVを使ってリクエストを送信するものでした。
今回使った FCMでは、メッセージ送信用の構造体 を使用します。

  • FCMで使用するデータ型

type Message struct {
	Data         map[string]string `json:"data,omitempty"`
	Notification *Notification     `json:"notification,omitempty"`
	Android      *AndroidConfig    `json:"android,omitempty"`
	Webpush      *WebpushConfig    `json:"webpush,omitempty"`
	APNS         *APNSConfig       `json:"apns,omitempty"`
	FCMOptions   *FCMOptions       `json:"fcm_options,omitempty"`
	Tokenstring            `json:"token,omitempty"`
	Topicstring            `json:"-"`
	Conditionstring            `json:"condition,omitempty"`
}
  • FCMのサンプル

{
    "data": {
        "TestKey": "8c168a0a-d521-4dc0-8cab-eb0bf6346e81"
    },
    "notification": {
        "title": "地震情報:宮城県沖(震源地)",
        "body": "最大震度3を観測する地震が発生しました。(気象庁発表)\r\n震源地はは約60km、地震の規模(マグニチュード)は4.2と推定されます。\r\nこ"
    },
    "id": {},
    "webpush": {},
    "apns": {},
    "token": "xxxxxxxxxxxx"
}
  • BoltzEngine のCSVフォーマット

    • トークン

    • 有効期限(秒)

    • 通知するメッセージ

    • 追加パラメータ

  • BoltzEngine のサンプルCSV


送信結果が分かりやすい


FCMの方はデータで返ってきて、BoltzEngineの方は標準出力から取得できます。

  • FCMで使用するデータ型

type SendResponse struct {
    Success   bool
    MessageID string
    Error     error
}
  • FCM 結果サンプル

&service.SendResponse{
    Success:true,
    MessageID:"projects/test-project/messages/0:1655804505360118%a4d59474a4d59474", 
    Error:error(nil), 
}
  • BoltzEngine レスポンス結果(公式抜粋)

    1. 発生時刻

    2. 送信に使ったトークン

    3. 更新後のトークン(空なら無効になったと扱う)

  • Boltz Engine サンプル

[2022-06-10T07:00:02Z,xxxxxxxxxxxxx,]


まとめ

今回、FCM を使用してみて、特にレスポンス結果を扱いやすいなと感じました。
今回のプロジェクトでは、レスポンス結果をDBに履歴として残す必要があり、Boltz Engineの時は実装していなかったので、どうしたものかと思ったのですが、実際に実装してみて、かなり楽にできました。
調査してみたら、Boltz Engine でも可能なので、必要であれば実装してもいいかもしれないです。

最後に

現在、レスキューナウでは、災害情報の提供、災害情報を活用した安否確認サービスなどのWebサービスの開発エンジニアを募集しています!
社員・フリーランスに関わらず、参画後に安心してご活躍できることを目指し、応募された方の特性・ご希望にマッチしたチームをご紹介します。
ちょっと話を聞いてみたい、ぜひ応募したい、など、当社にご興味を持っていただけましたら、お気軽にエントリーください!!