【第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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!