
【第11回】Go言語(Golang)入門~FCM送信編~
2021.12.20
第11回~Go言語(Golang)入門~

(株)ライトコードの笹川(ささがわ)です!
今回は、Firebase Cloud Messaging(FCM)をGoで送信して、Androidで受け取ってみようと思います。
それでは、いってみましょう!
前回の記事はこちら
Firebaseの認証をしよう
FCMは、Firebaseのサービスのひとつなので、Firebaseへの認証が必要となります。
そのため、まずは、認証を終わらせましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package main import ( "context" "log" "cloud.google.com/go/firestore" firebase "firebase.google.com/go" "google.golang.org/api/option" ) func main() { ctx := context.Background() // Firebase初期化 _, err := firebaseInit(ctx) if err != nil { log.Fatal(err) } } // firebaseInit Firebaseの初期化 func firebaseInit(ctx context.Context) (*messaging.Client, error) { // Use a service account sa := option.WithCredentialsFile("path/to/serviceAccount.json") app, err := firebase.NewApp(ctx, nil, sa) if err != nil { log.Fatalln(err) return nil, err } client, err := app.Messaging(ctx) if err != nil { log.Fatalln(err) return nil, err } return client, nil } |
Firestore の時との違いは、 app から取得する client が Messaging になっている所になります。
同じ Firebase で提供されているサービスなので、ほぼ実装が変わらず、使い回せるのは楽ですね。
ちなみに、導入の部分は第2回で詳しく紹介していますので、そちらもご参考ください。
メッセージを作ってみよう
今回は、iOS と Andorid の両方に届き、Android のアプリが kill状態でも届くように作ってみます。
Goで送信する場合は、すでにメッセージ送信用の構造体が用意されているので、そちらに当て込んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | func createMessage(topic string, title string, body string, tag string) *messaging.Message { // android用の設定初期化 android := new(messaging.AndroidConfig) // 通知優先度設定 android.Priority = "high" // android用の通知設定初期化 androirNotification := new(messaging.AndroidNotification) // チャンネル設定(Android8以降は必須。受信する側の設定と合わせる) androirNotification.ChannelID = "channel_1" // タグ設定(あってもなくてもいい) androirNotification.Tag = tag android.Notification = androirNotification // 大本の通知設定の初期化 notification := new(messaging.Notification) // タイトル notification.Title = title // 本文 notification.Body = body // メッセージ構造体の初期化 message := &messaging.Message{ // データの設定(通知を出す前にデータだけ受け取りたいときはこっちに設定する) Data: map[string]string{ "title": title, "body": body, }, // Android用の設定 Android: android, // 通知設定 Notification: notification, // 配信先(トピック) Topic: topic, } return message } |
今回は、複数端末で受信するために、トピック宛に送信するように作成しました。
送信する際の詳しいオプションなどは、以下のドキュメントに詳しく載っています。
【参考ドキュメント】
https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ja
本記事でご紹介している内容以外の方法は、参考になるかと思います。
送信してみよう
Android 側での受信設定の説明は、以下の公式ドキュメントをご参考ください。
【公式ドキュメント】
https://firebase.google.com/docs/cloud-messaging/android/client?hl=ja
適当な「タイトル」と「トピック」を設定して実行してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | package main import ( "context" "log" firebase "firebase.google.com/go" "firebase.google.com/go/messaging" "google.golang.org/api/option" ) func main() { ctx := context.Background() // Firebase初期化 client, err := firebaseInit(ctx) if err != nil { log.Fatal(err) } message := createMessage("test", "テスト送信", "これはテスト送信です。", "test1") // Send a message to the devices subscribed to the provided topic. response, err := client.Send(ctx, message) if err != nil { log.Fatalln(err) } // Response is a message ID string. log.Println("Successfully sent message:", response) } func createMessage(topic string, title string, body string, tag string) *messaging.Message { // android用の設定初期化 android := new(messaging.AndroidConfig) // 通知優先度設定 android.Priority = "high" // android用の通知設定初期化 androirNotification := new(messaging.AndroidNotification) // チャンネル設定(Android8以降は必須。受信する側の設定と合わせる) androirNotification.ChannelID = "channel_1" // タグ設定(あってもなくてもいい) androirNotification.Tag = tag android.Notification = androirNotification // 大本の通知設定の初期化 notification := new(messaging.Notification) // タイトル notification.Title = title // 本文 notification.Body = body // メッセージ構造体の初期化 message := &messaging.Message{ // データの設定(通知を出す前にデータだけ受け取りたいときはこっちに設定する) Data: map[string]string{ "title": title, "body": body, }, // Android用の設定 Android: android, // 通知設定 Notification: notification, // 配信先(トピック) Topic: topic, } return message } // firebaseInit Firebaseの初期化 func firebaseInit(ctx context.Context) (*messaging.Client, error) { // Use a service account sa := option.WithCredentialsFile("path/to/serviceAccount.json") app, err := firebase.NewApp(ctx, nil, sa) if err != nil { log.Fatalln(err) return nil, err } client, err := app.Messaging(ctx) if err != nil { log.Fatalln(err) return nil, err } return client, nil } |
確認
タイトル | テスト送信 |
本文 | これはテスト送信です。 |
実行すると、上記の通知が、Andoridアプリを起動していなくても届くはずです。

無事、届いてますね!
第12回へつづく!
Go言語(Golang)から FCM を送信の採用することは多くないと思いますが、簡単なチャットアプリのAPIなどでは利用できそうですね!
ちなみに、笹川の個人開発では『サポ魂』というアプリで、ツイッター検索したデータをユーザーに FCM で届けています。
それにしても、Firebaseのサービスは便利です。
個人的には、今後も色々使ってみたいサービスですので、皆様も是非使ってください。
なお、今回作成したgoファイルは、こちらのリポジトリにて管理しています。
次回の記事はこちら
オススメのGo入門本
こちらの記事もオススメ!
第1回の記事はこちら
書いた人はこんな人

- 新潟生まれ新潟育ち本業はモバイルアプリエンジニア。
日々、猫(犬)エンジニアとして活躍中!
IT技術9月 20, 2023開発効率を少しだけ上げるGithubActionsの便利な使い方
IT技術4月 7, 2023【ISUCON部】ライトコードISUCON部 始動!
IT技術4月 18, 2022【Android】Webでよくみる入力Boxを手作り
IT技術1月 19, 2022【Android】SeekbarでスイッチなUIを作る