• トップ
  • ブログ一覧
  • 【第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)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    笹川(エンジニア)
    笹川(エンジニア)
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background