Firebase Cloud Messaging (FCM)で通知を送る

重要な変更点

  • クライアント側では messaging.getToken()は deprecatedになりました。register() + onRegistered() で FID を取得する方式を使います。
  • サーバー側(Admin SDK)でも Message.token / MulticastMessage.tokens がdeprecatedとなりました。fid / fids、sendEachForMulticast({ fids }) を使います。

1. クライアントアプリ側でトークン(FID)を取得する

旧方式(非推奨)

messaging.getToken({
  vapidKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
})

→ このメソッドは deprecated。

新方式(推奨・FIDベース)

import { getMessaging, onRegistered, register } from "firebase/messaging";

const messaging = getMessaging();

// 登録が完了すると Installation ID (FID) がコールバックで渡される
onRegistered(messaging, (installationId) => {
  console.log('Registered installation ID:', installationId);
  sendRegistrationToServer(installationId); // サーバーへ送信
});

register(messaging, {
  vapidKey: '<YOUR_PUBLIC_VAPID_KEY_HERE>' // Firebase Console で確認できる公開鍵
}).catch((err) => {
  console.error('An error occurred while registering', err);
});
  • VAPID 鍵は従来どおり Firebase Console から取得し、register() の引数として渡します。
  • firebase-messaging-sw.js をドメインのルートに配置しておく必要がある点は変わりません。
  • 公式ドキュメントは「Firebase Installation ID API と旧トークン API を同時に併用しないこと」と明記しています(片方に統一する)。

2. クライアントアプリからサーバーアプリへ FID(または旧トークン)を送信する

  • 従来どおり、取得した識別子(FID or token)を自前のサーバーに送って DB に保存します。
  • 今から新規実装するなら、DB に保存するキーは fid を主として設計しておくと、後々の再移行が不要になります。

3. サーバーアプリから特定の端末(FID / token)へ通知を送信する

  • 現状、公式ドキュメントの「特定デバイスへの送信」サンプルは旧 token ベースのままで更新が追いついていません。
  • Admin SDK 側では Message.token → Message.fid、MulticastMessage.tokens → MulticastMessage.fids という対応関係が用意されつつありますが、公式の具体的なサンプルコードはまだ乏しいため、実装時は各言語 Admin SDK(Node.js v14.1.0+、Java v9.10.0+、Python v7.5.0+)のリファレンス/リリースノートを都度確認するのが安全です。
  • 移行期間中は token を使った送信も引き続き動作するので、既存実装を即座に壊す必要はありません。

参考:


● 通知の送信方法(変更なし・引き続き有効)

・「以前の HTTP」(レガシー)→ 2024年6月に完全廃止済み。使用不可。
 ( https://fcm.googleapis.com/fcm/send ) ※現在は動作しません

・「HTTP v1」を使う ( https://fcm.googleapis.com/v1/projects/<プロジェクトID>/messages:send )
  必要なもの(サービスアカウントの秘密鍵 json → 秘密鍵 jsonからアクセストークンを生成してそれを使用する)

参考: 以前の HTTP から HTTP v1 に移行する


● 特定の個人に対して通知を送信する(FID/トークン)

トークン(および今後は FID)の扱いについて: https://firebase.google.com/docs/cloud-messaging/manage-tokens?hl=ja

※上記ドキュメントも token ベースの記述が中心で、FID への言及がまだ薄いため、実装前に最新のリリースノートを確認することを推奨します。


● 全員に対して通知を送信する(トピック)

https://qiita.com/yum_fishing/items/54b4f10dea24e0d7722d

・(サーバー側)Topic を作成する
・(利用者)Topic に登録する(この登録も内部的には token/FID を使う)
・(サーバー側)Topic に対して通知を送信すると、そのトピックをサブスクライブしている全員に通知が届く

補足:今すぐ何をすべきか

  1. 新規実装は register() / onRegistered()(FID ベース)で書く。
  2. 既存の getToken() 実装は今すぐ壊れないが、次回の改修タイミングで移行を検討する。
  3. getToken(旧)と register(新)を同一アプリ内で混在させない(公式が明示的に禁止)。
  4. サーバー側送信ロジックは、Admin SDK のバージョンアップ時に token→fid の変更が入っていないかリリースノートを確認する。
No.2302
09/15 14:36

edit