🔔

RailsでFirebase Cloud Messaging(FCM)を使ってプッシュ通知を送信する

2020/09/24に公開

概要

流れ

  1. 登録トークンを取得する
  2. 取得したトークンを使って送信処理(FCM HTTP v1 API を使用)
    1. 登録トークンを指定しての送信(1 件ずつ送信)
    2. トピックへの送信(複数の対象への送信)

注意点

記事中に登場する、{プロジェクトID}のような中括弧で囲んだ項目は、中身をその場所に展開することを指すことにします。実際には中括弧は不要です。

登録トークンの取得(アプリ側)

登録トークンとは

FCM がアプリ インスタンスを一意に識別するためのトークン。プッシュ通知を受け取るアプリ側で設定を行う。

登録トークンの取得

Firebase コンソール側での準備(認証情報の設定)

OAuth 2.0 アクセストークンの取得(Rails 側)

  • googleauthgem を使用
scope = 'https://www.googleapis.com/auth/firebase.messaging'
authorizer = Google::Auth::ServiceAccountCredentials.make_creds( json_key_io: File.open('/path/to/service_account_json_key.json'), scope: scope)
authorizer.fetch_access_token!

登録トークンを指定して送信(Rails 側)

  • POST https://fcm.googleapis.com/v1/projects/{プロジェクトID}/messages:send
  • Header
    • Authorization
      • Bearer {OAuth2.0 アクセストークン}
    • Content-Type
      • application/json
    • Body
{
    "message":{
        "token":"{登録トークン}",
        "notification":{
            "body":"This is an FCM notification message!",
            "title":"FCM Message"
        }
     }
}
  • プロジェクト ID の取得
    • 設定 → 全般 → プロジェクト ID
uri = URI.parse("https://fcm.googleapis.com/v1/projects/{プロジェクトID}/messages:send")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
req = Net::HTTP::Post.new(uri.request_uri)
req['Authorization'] = "Bearer #{access_token['access_token']}"
req['Content-Type'] = "application/json"
req.body = body
res = http.request(req)

トピックへ登録トークンを紐づける(Rails 側)

  • POST https://iid.googleapis.com/iid/v1/{登録トークン}/rel/topics/{トピック名}
  • Header
    • Authorization
      • key={サーバーキー}
      • サーバーキーは、プロジェクトを設定 → Cloud Messaging → サーバーキー から取得

トピックへ送信(Rails 側)

  • POST https://fcm.googleapis.com/v1/projects/{プロジェクトID}/messages:send
  • Header
    • Authorization
      • Bearer {OAuth2.0 アクセストークン}
    • Body
 {
     "message" : {
         "topic" : "{トピック名}",
         "notification" : {
             "title" : "title test",
             "body" : "topic test"
        }
    }
}

注意点

  • トピックへ登録トークンを紐づける API と、通知を送信する API で認証の方法が違うので気をつけてください

Discussion