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 レスポンス結果(公式抜粋)
発生時刻
送信に使ったトークン
更新後のトークン(空なら無効になったと扱う)
Boltz Engine サンプル
[2022-06-10T07:00:02Z,xxxxxxxxxxxxx,]
まとめ
今回、FCM を使用してみて、特にレスポンス結果を扱いやすいなと感じました。
今回のプロジェクトでは、レスポンス結果をDBに履歴として残す必要があり、Boltz Engineの時は実装していなかったので、どうしたものかと思ったのですが、実際に実装してみて、かなり楽にできました。
調査してみたら、Boltz Engine でも可能なので、必要であれば実装してもいいかもしれないです。
最後に
現在、レスキューナウでは、災害情報の提供、災害情報を活用した安否確認サービスなどのWebサービスの開発エンジニアを募集しています!
社員・フリーランスに関わらず、参画後に安心してご活躍できることを目指し、応募された方の特性・ご希望にマッチしたチームをご紹介します。
ちょっと話を聞いてみたい、ぜひ応募したい、など、当社にご興味を持っていただけましたら、お気軽にエントリーください!!