Firebase Cloud Messagingの通知メッセージのタイプについて

こんにちは。エキサイトでアプリエンジニアをしている岡島です。今回はFirebase Cloud Messaging(FCM)の通知について共有していこうと思います。FCMの通知には「通知メッセージ(Notification Message)」と「データメッセージ(Data Message)」の2種類があります。

今回開発において、アプリで独自UIの通知を表示することを検討しました。そのときに通知メッセージとデータメッセージの違いについて理解する必要があったので、調査したことについてまとめます。

通知メッセージについて

通知メッセージはOSの通知システムにより、通知センターに表示されるメッセージです。アプリがバックグラウンドや終了状態の時でも通知を送信することができます。

通知メッセージの形式

{
  "message":{
    "token":"<FCM_TOKEN>",
    "notification":{
      "title":"通知のタイトル",
      "body":"メッセージ"
    }
  }
}

動作

アプリの起動状態により処理が変わります。フォアグラウンドの状態であれば、FCMのonMessage関数で処理を行います。バックグラウンドや終了状態では、OSの通知センターに自動で表示されます。

状態 動作
フォアグラウンド onMessage で受信し、アプリ内で処理を行う
バックグラウンド OSの通知センターに自動で表示される
アプリ終了状態 OSの通知センターに自動で表示される

データメッセージについて

データメッセージは、通知として表示されるのではなく、アプリ側で通知が来たときの挙動を制御することができます。

データメッセージの形式

{
  "message":{
    "token":"<FCM_TOKEN>",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

データメッセージではdataというキーに自由にデータを書くことができます。このキーとバリューを用いてアプリ側で制御することができます。

動作

データメッセージでは、通知メッセージタイプと異なり、フォアグラウンドやバックグランド時にアプリ側で通知の処理を制御することができます。

状態 動作
フォアグラウンド onMessage で処理可能
バックグラウンド onBackgroundMessage で処理可能

通知は自動で通知センターには表示されないので、flutter_local_notificationsなどを用いてアプリ側で通知を表示させる必要があります。

通知メッセージとデータメッセージの違い

通知メッセージとデータメッセージの違いは、通知センターに自動で表示されるかどうかです。

  • 通知メッセージ: notification キーを含み、自動で通知が表示される。
  • データメッセージ: data のみを含み、アプリ側で処理が必要。

データメッセージの使用用途例について

データメッセージは、通知が自動的に通知センターに表示されるまでに、ハンドリングすることができます。今回の開発ではアプリ内で独自の通知UIを表示させることを想定していました。他にもどの通知が開かれたかログを取ることにも使えそうです。

実装時の注意点

メッセージのペイロードnotification というキーが含まれている場合は、そのメッセージは通知メッセージとして扱われるので通知センターに自動的に表示されることに注意してください。

まとめ

今回はFCMの「通知メッセージ」と「データメッセージ」についてまとめてみました。通知を実装するときに適切にメッセージのタイプを使い分けることが必要だと思いました。

この記事が誰かのお役に立てれば幸いです。

参考文献

https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ja