メインコンテンツまでスキップ

第11章:通知の種類(notification/data)を使い分ける🧩⚖️

この章はひとことで言うと、「通知を“勝手に出してほしい”のか、アプリで“握って制御したい”のかを決めて、FCMの notificationdata を上手に混ぜる回です🔔🧠


1) まず結論:迷ったら「notification + data」からでOK🙆‍♀️✨

Notification vs Data Message

FCMのメッセージは大きく2種類です👇

  • notification:OS/ブラウザが“通知表示”を助けてくれる(楽ちん)🔔
  • data:アプリが“中身をどう扱うか”自由に決められる(強い)🧩

そして重要ポイント:

  • 最大サイズは両方とも 4096 bytes(約4KB)(ただしコンソール送信は 1000文字制限あり)(Firebase)

  • notification + data を両方入れると、

    • フォアグラウンド:アプリが両方の中身を受け取って自由に処理できる
    • バックグラウンド:通知は表示されて、dataは“タップされた時”に扱われる(この性質を利用すると気持ちいい)(Firebase)

2) Web(React)での挙動:ここだけは覚えて勝ち🏆🌐

Web Behavior by State

Webは「タブが前にあるかどうか」で挙動が分かれます👀

  • 前(フォアグラウンド):ページ側の onMessage が受ける📩
  • 裏/閉じてる(バックグラウンド):Service Worker 側の onBackgroundMessage が受ける🧑‍🚒

しかもWebは、notification か “両方” のメッセージだと通知が自動表示されやすい、という強い特徴があります(データだけだと“自分で通知表示”が必要になることが多い)(Firebase)

さらにWebだけの超実用ポイント👇

  • 通知クリックでアプリに戻すリンクは webpush.fcm_options.link が便利🧷

  • でも dataメッセージ単体は fcm_options.link をサポートしないので、

    • dataにも通知を付ける(=notification + data)
    • もしくは Service Worker で showNotification を自前実装 のどっちかが王道です🧠(Firebase)

3) 使い分けの判断表🗺️🧩

Message Type Decision Matrix

やりたいことおすすめ理由
とにかく通知を出したい(最短)notificationのみ表示はおまかせで楽🔔
通知クリックで“特定ページ”へ飛ばしたい(Web)notification + data + webpush.fcm_options.link自動表示+リンクが強い🧷(Firebase)
画面内のUI更新(バッジ/トースト/一覧差し替え)もやりたいnotification + data(or dataのみ)dataがあると制御できる🧠
通知表示の見た目/条件を“完全に自前”で握りたいdataのみ + SWで通知表示代わりに実装が増える🧑‍🚒

4) payload設計のコツ:4KBに勝つ🥊📦

Payload Size Limit (4KB)

通知は短距離走です🏃💨 4KB制限があるので(しかもJSONは意外と膨らむ)、やることはだいたいこれ👇

  • ✅ 通知に入れるのは タイトル/本文(短い)
  • ✅ dataに入れるのは “あとで取りに行けるID”(例:commentId, postId
  • ✅ 詳細本文は Firestoreから取りに行く(通知は“入口”)🚪🗃️

そして地味に大事👇 **dataの値は「文字列だけ」**が基本です(キーも値もstring)(Firebase) なので、数値やbooleanを入れたい時は "1" / "true" みたいに文字列化します🙂


5) 今回の題材:コメント通知の“いい感じpayload”例📝🔔

Ideal Comment Payload Structure

目標:「通知として見える」+「アプリがわかる情報も持ってる」✨

**dataに入れたい最小セット(おすすめ)**👇

  • type: "comment_created" みたいなイベント種別
  • commentId: FirestoreのコメントID
  • postId: 親(記事/投稿)ID
  • url: クリック後に開きたいURL(Webで超便利)
  • actorName: 誰がコメントしたか(表示用)
  • preview: 本文の短い抜粋(短く!)

6) 手を動かす①:TypeScriptでpayload型を作る🧱✨

「文字列しか来ない」前提で型を作ると、事故が減ります🧯

// FCM data payload(全部 string)
export type CommentNotifyData = {
type: "comment_created";
commentId: string;
postId: string;
url: string; // 例: "/posts/abc#comment-xyz"
actorName: string; // 例: "こみやんま"
preview: string; // 例: "いい感じ…"
};

7) 手を動かす②:React(フォアグラウンド)で受け取ってUI更新📲✨

Foreground UI Update Flow

フォアグラウンドでは onMessage が来ます📩(Firebase) やりたいのはこの2つ👇

  • トーストを出す🍞✨
  • 画面の未読バッジやコメント一覧を更新する🧷
import { getMessaging, onMessage } from "firebase/messaging";

const messaging = getMessaging();

onMessage(messaging, (payload) => {
// payload.data があれば、ここでUI更新できる
const data = payload.data as unknown as Partial<Record<string, string>>;

if (data?.type === "comment_created") {
// 例:トースト表示(あなたのUI実装に合わせて)
console.log("コメント通知:", data.actorName, data.preview);

// 例:必要なら Firestore から commentId で詳細取得 → 状態更新
}
});

ポイント:notification の見た目はOS/ブラウザ任せになりがちなので、アプリ内の気持ちよさ(トースト/バッジ)は data で作るのがコツです😄


8) 手を動かす③:Service Worker(バックグラウンド)側の考え方🧑‍🚒🔔

バックグラウンドでは onBackgroundMessage が重要です🧩(Firebase)

  • notification が付いてると 通知が自動表示されやすい
  • data だけだと 自分で通知を出す実装が必要になることが多い

なので最初は notification + dataにしておくとラクです😇(Firebase)

(もし data-only で“自前通知”したいなら、SWで showNotification を書く形になります🛠️)


9) 送信側のイメージ:notification + data + Webリンク🧷📤

Webだと webpush.fcm_options.link がかなり効きます(通知クリックでタブを前に出したり、新規タブで開いたり)(Firebase)

送信は信頼できる場所(Admin SDK / HTTP v1)からが基本です(Firebase) ランタイムの目安としては:

  • Functions(Firebase)のNodeは 22 / 20 がフルサポートで、18はdeprecated(Firebase)
  • もし Cloud Run functions で言語を選ぶなら .NET 8Python 3.13 がGAになっています(Google Cloud Documentation)

10) ミニ課題:payload設計メモを作る(短く!)📝🎯

次の3点を1枚にまとめてください👇(箇条書きでOK)

  1. 通知で見せる情報(title/body に何を入れる?)🔔
  2. dataで渡す最小キー(ID中心になってる?)🗝️
  3. 4KBを超えそうな要素(本文丸ごと入れてない?)🧯

11) AI活用:4KBと“短く伝わる通知文”の最強コンボ🤖✂️✨

AI Text Compression

通知文って、長いと読まれないし、4KBも食います😇 ここはAIがめちゃ得意です🔥

  • Firebase AI Logic は、アプリから Gemini/Imagen を安全に使う入口として整理されています🧠(Firebase)
  • 例えばコメント本文を「短い通知文(個人情報っぽい部分は伏せる)」に整形して、title/body を圧縮できます✂️📩

さらに、開発中の“作業支援”はこう👇

  • Antigravity は「エージェントが計画→実装→検証」まで回す思想の開発基盤として説明されています🛸(Google Codelabs)
  • Gemini CLI も Cloud Shell などで使える導線が整理されています💻✨(Google Cloud Documentation)

この章でのAIの使いどころは超シンプルでOK👇

  • 通知文を短くする(title 30文字、body 60文字…みたいな制約を守る)
  • payloadのキーを削る提案をさせる(4KB節約)
  • “安全に出していい情報か”チェックをさせる(個人情報っぽいのを伏せる)

12) チェック✅(理解できたら勝ち🎉)

  • ✅ 「通知を勝手に出したい」= notification、 「アプリで制御したい」= data って言える?(Firebase)
  • ✅ Webで webpush.fcm_options.link が便利で、data-only だと制約があるのを理解した?(Firebase)
  • ✅ 4KB制限を意識して「IDだけ渡して詳細はFirestore」が言える?(Firebase)
  • ✅ dataの値は基本 string しか入れない設計になってる?(Firebase)

次の第12章(テスト送信🧪🎯)に行く前に、今の段階では 「notification + data で送ると、フォアでUI更新できて、バックで通知も出せる」 って感覚が掴めてればOKです😄🔔✨