【第11回】Go言語(Golang)入門~FCM送信編~
IT技術
第11回~Go言語(Golang)入門~
(株)ライトコードの笹川(ささがわ)です!
今回は、Firebase Cloud Messaging(FCM)をGoで送信して、Androidで受け取ってみようと思います。
それでは、いってみましょう!
前回の記事はこちら
Firebaseの認証をしよう
FCMは、Firebaseのサービスのひとつなので、Firebaseへの認証が必要となります。
そのため、まずは、認証を終わらせましょう!
1package main
2
3import (
4 "context"
5 "log"
6
7 "cloud.google.com/go/firestore"
8 firebase "firebase.google.com/go"
9 "google.golang.org/api/option"
10)
11
12func main() {
13 ctx := context.Background()
14 // Firebase初期化
15 _, err := firebaseInit(ctx)
16 if err != nil {
17 log.Fatal(err)
18 }
19}
20
21// firebaseInit Firebaseの初期化
22func firebaseInit(ctx context.Context) (*messaging.Client, error) {
23 // Use a service account
24 sa := option.WithCredentialsFile("path/to/serviceAccount.json")
25 app, err := firebase.NewApp(ctx, nil, sa)
26 if err != nil {
27 log.Fatalln(err)
28 return nil, err
29 }
30
31 client, err := app.Messaging(ctx)
32 if err != nil {
33 log.Fatalln(err)
34 return nil, err
35 }
36
37 return client, nil
38}
Firestore の時との違いは、 app から取得する client が Messaging になっている所になります。
同じ Firebase で提供されているサービスなので、ほぼ実装が変わらず、使い回せるのは楽ですね。
ちなみに、導入の部分は第2回で詳しく紹介していますので、そちらもご参考ください。
メッセージを作ってみよう
今回は、iOS と Andorid の両方に届き、Android のアプリが kill状態でも届くように作ってみます。
Goで送信する場合は、すでにメッセージ送信用の構造体が用意されているので、そちらに当て込んでいきます。
1func createMessage(topic string, title string, body string, tag string) *messaging.Message {
2 // android用の設定初期化
3 android := new(messaging.AndroidConfig)
4 // 通知優先度設定
5 android.Priority = "high"
6 // android用の通知設定初期化
7 androirNotification := new(messaging.AndroidNotification)
8 // チャンネル設定(Android8以降は必須。受信する側の設定と合わせる)
9 androirNotification.ChannelID = "channel_1"
10 // タグ設定(あってもなくてもいい)
11 androirNotification.Tag = tag
12 android.Notification = androirNotification
13 // 大本の通知設定の初期化
14 notification := new(messaging.Notification)
15 // タイトル
16 notification.Title = title
17 // 本文
18 notification.Body = body
19 // メッセージ構造体の初期化
20 message := &messaging.Message{
21 // データの設定(通知を出す前にデータだけ受け取りたいときはこっちに設定する)
22 Data: map[string]string{
23 "title": title,
24 "body": body,
25 },
26 // Android用の設定
27 Android: android,
28 // 通知設定
29 Notification: notification,
30 // 配信先(トピック)
31 Topic: topic,
32 }
33 return message
34}
今回は、複数端末で受信するために、トピック宛に送信するように作成しました。
送信する際の詳しいオプションなどは、以下のドキュメントに詳しく載っています。
【参考ドキュメント】
https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ja
本記事でご紹介している内容以外の方法は、参考になるかと思います。
送信してみよう
Android 側での受信設定の説明は、以下の公式ドキュメントをご参考ください。
【公式ドキュメント】
https://firebase.google.com/docs/cloud-messaging/android/client?hl=ja
適当な「タイトル」と「トピック」を設定して実行してみます。
1package main
2
3import (
4 "context"
5 "log"
6
7 firebase "firebase.google.com/go"
8 "firebase.google.com/go/messaging"
9 "google.golang.org/api/option"
10)
11
12func main() {
13 ctx := context.Background()
14 // Firebase初期化
15 client, err := firebaseInit(ctx)
16 if err != nil {
17 log.Fatal(err)
18 }
19
20 message := createMessage("test", "テスト送信", "これはテスト送信です。", "test1")
21
22 // Send a message to the devices subscribed to the provided topic.
23 response, err := client.Send(ctx, message)
24 if err != nil {
25 log.Fatalln(err)
26 }
27 // Response is a message ID string.
28 log.Println("Successfully sent message:", response)
29}
30
31func createMessage(topic string, title string, body string, tag string) *messaging.Message {
32 // android用の設定初期化
33 android := new(messaging.AndroidConfig)
34 // 通知優先度設定
35 android.Priority = "high"
36 // android用の通知設定初期化
37 androirNotification := new(messaging.AndroidNotification)
38 // チャンネル設定(Android8以降は必須。受信する側の設定と合わせる)
39 androirNotification.ChannelID = "channel_1"
40 // タグ設定(あってもなくてもいい)
41 androirNotification.Tag = tag
42 android.Notification = androirNotification
43 // 大本の通知設定の初期化
44 notification := new(messaging.Notification)
45 // タイトル
46 notification.Title = title
47 // 本文
48 notification.Body = body
49 // メッセージ構造体の初期化
50 message := &messaging.Message{
51 // データの設定(通知を出す前にデータだけ受け取りたいときはこっちに設定する)
52 Data: map[string]string{
53 "title": title,
54 "body": body,
55 },
56 // Android用の設定
57 Android: android,
58 // 通知設定
59 Notification: notification,
60 // 配信先(トピック)
61 Topic: topic,
62 }
63 return message
64}
65
66// firebaseInit Firebaseの初期化
67func firebaseInit(ctx context.Context) (*messaging.Client, error) {
68 // Use a service account
69 sa := option.WithCredentialsFile("path/to/serviceAccount.json")
70 app, err := firebase.NewApp(ctx, nil, sa)
71 if err != nil {
72 log.Fatalln(err)
73 return nil, err
74 }
75
76 client, err := app.Messaging(ctx)
77 if err != nil {
78 log.Fatalln(err)
79 return nil, err
80 }
81
82 return client, nil
83}
確認
タイトル | テスト送信 |
本文 | これはテスト送信です。 |
実行すると、上記の通知が、Andoridアプリを起動していなくても届くはずです。
無事、届いてますね!
第12回へつづく!
Go言語(Golang)から FCM を送信の採用することは多くないと思いますが、簡単なチャットアプリのAPIなどでは利用できそうですね!
ちなみに、笹川の個人開発では『サポ魂』というアプリで、ツイッター検索したデータをユーザーに FCM で届けています。
それにしても、Firebaseのサービスは便利です。
個人的には、今後も色々使ってみたいサービスですので、皆様も是非使ってください。
なお、今回作成したgoファイルは、こちらのリポジトリにて管理しています。
次回の記事はこちら
オススメのGo入門本
こちらの記事もオススメ!
2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
第1回の記事はこちら
2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
笹川(エンジニア)
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!
おすすめ記事
移転したライトコード大阪オフィスを調査せよ!
広告メディア事業部
2024.04.03
日常
【GCP】BIG QUERYを触り程度に理解してみる
かねまさ(エンジニア)
2024.04.02
IT技術
【Android】Github ActionsでFirebase Test Labの実行を分散する
笹川(エンジニア)
2024.04.02
IT技術
【Next.js】App Router で使用できるキャッシュまとめ
モーリー(エンジニア)
2024.03.29
IT技術
GitHubActionsのランナーに触れてみた
こやまん(エンジニア)
2024.03.28
IT技術