• トップ
  • ブログ一覧
  • 【第11回】Go言語(Golang)入門~FCM送信編~
  • 【第11回】Go言語(Golang)入門~FCM送信編~

    笹川(エンジニア)笹川(エンジニア)
    2019.11.20

    IT技術

    第11回~Go言語(Golang)入門~

    秋山笹川先生

    (株)ライトコードの笹川(ささがわ)です!

    今回は、Firebase Cloud Messaging(FCM)をGoで送信して、Androidで受け取ってみようと思います。

    それでは、いってみましょう!

    前回の記事はこちら

    featureImg2019.11.13【第10回】Go言語(Golang)入門~ObjectBox活用編~第10回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!今回は、前回に引き続き、Ob...

    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回で詳しく紹介していますので、そちらもご参考ください。

    featureImg2019.09.17【第2回】Go言語(Golang)入門~Firestore導入編~第2回~Go言語(Golang)を習得したい!~(株)ライトコードの笹川(ささがわ)です。前回に引き続き、今回もGo言...

    メッセージを作ってみよう

    今回は、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ファイルは、こちらのリポジトリにて管理しています。

    次回の記事はこちら

    featureImg2019.11.27【第12回】Go言語(Golang)入門~MySQL接続編~第12回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!今回は、データベース系の第3...

    オススメのGo入門本

    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る

     

    こちらの記事もオススメ!

    featureImg2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    第1回の記事はこちら

    featureImg2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事