📍

Go で Firebase Cloud Messaging を用いて Web push 通知を行う

2023/10/07に公開

概要

今回は Go から以下のような Web push 通知を送信する例を紹介します。

Firebase Cloud Messaging とは

Firebase の Cloud Messaging を用いることで Instagram や YouTube でも利用されている Web push 通知を送信することが出来ます。

https://firebase.google.com/docs/cloud-messaging

Push 通知を送信するまでの流れ

クライアントでトークンを発行する → トークンをサーバ側で保存する → サーバ側から Firebase に対してメッセージの発行を行う

React によるクライアント登録

firebase v9 ( @firebase/messaging@0.9.16 ) を用いたクライアント側での Firebase Cloud Messaging トークンの発行について説明します。

クライアント側では以下のコードを用いてクライアントごとに Firebase Cloud Messaging トークンを生成します。

import { getMessaging, getToken } from "firebase/messaging"
const app = initializeApp(firebaseConfig)
const messaging = getMessaging(app)
const fcm_token = await getToken(messaging, {
    vapidKey: "****",
})
console.log(fcm_token)

その後、クライアントから何かしらの方法 ( API など ) を用いてサーバ側でトークンを保存します。ここで保存したトークンは適切なタイミングで更新などを行う必要があります。
https://firebase.google.com/docs/cloud-messaging/manage-tokens

この記事では上記のトークンをサーバ側で保存している前提で進めます。

Go による通知送信

一度に複数のデバイス ( ユーザ ) に通知を送信するサンプルを掲載します。
https://firebase.google.com/docs/cloud-messaging/send-message

  1. firebase の初期化
import (
  firebase "firebase.google.com/go"
)

app, err := firebase.NewApp(context.TODO(), &firebase.Config{})
if err != nil {
  log.Print(err)
}
  1. Cloud Messaging の初期化
client, err := app.Messaging(context.TODO())
if err != nil {
  log.Print(err)
}
  1. message の作成

WebpushFcmOptions.Linkhttps のリンクを設定することで Push 通知をクリックした際に遷移するリンクを設定出来ます。

Tokens には各クライアントで生成した Firebase Cloud Messaging のトークンを文字列の配列で設定します。

message := &messaging.MulticastMessage{
  Tokens:       tokens,
  Notification: notification,
  Webpush: &messaging.WebpushConfig{
    FcmOptions: &messaging.WebpushFcmOptions{
      Link: "https://example.com",
    },
  },
}
  1. message の送信
br, err := client.SendMulticast(context.TODO(), message)
if err != nil {
  log.Print(err)
}

Discussion