Firebase Cloud Messaging(FCM)でPush通知の実装(Ruby)

要件

Firebase Cloud Messaging(FCM)でPush通知の実装を行います(Ruby)
アプリ開発を初めて行った時、「Push通知はどうやって実装するんだろう」とさっぱり分かりませんでしたが、サーバーサイド(Ruby)からFCMにRequestする方法をご紹介します。

料金

Firebase Cloud Messaging(FCM)がPush通知に該当する箇所ですが、FirebaseをPush通知だけで利用するのであれば、無料で利用できます。

詳細はこちら

FCMアーキテクチャ


本記事では赤枠部分のFCMへのインタフェースを実装しています。
参照

実装解説

(1) ユーザーがログイン時、会員登録時など、DeviceTokenをアプリからサーバーサイドに送信し、データベースに保存しておく必要があります。

iOSの実装例はこちらなど、多数のブログがありますので、ここでは割愛します。

(2) FCMクライアントを初期化します。

(3) オプションの設定をします。

いくつかポイントとなるオプションだけご紹介します。
sound サウンドファイルを用意すれば、Push通知の音を自由に変更できます。
badge ホームアイコンの右肩にあるバッチの件数を設定できます。
show_in_foreground アプリがフォアグランドにある場合も通知を表示できる(ただし全ての通知が表示されるためアプリ側で通知の表示を判定したい場合は使えない)
その他オプションは、2番目の引数を介して、dataやtime_to_liveなどのHTTP Message パラメータをハッシュとして送信することができます。
パラメータの種類はこちらをご確認ください。

(4) DeviceTokenの配列をFCMクライアントに渡して、送信します。

            
              require 'fcm'
              require 'dotenv'
              Dotenv.load

              class PushNotification
                def initialize
                  @registration_ids = []
                  @fcm = FCM.new("#{ENV['FCM_SERVER_KEY']}")
                end

                def direct_messsage(sender, receiver)
                  message = "#{sender.name}さんからメッセージが届いています!"
                  fetch_device_tokens(receiver)
                  fcm_send!(receiver, message)
                end

                private

                def fcm_send!(user, message)
                  if @registration_ids
                    options = {
                      priority: 'high',
                      notification: {
                        body: message,
                        sound: 'push_sound.wav',
                        badge: user.unread_messages_count,
                      },
                      data: {
                        show_in_foreground: true,
                        message: message,
                      }
                    }
                    response = @fcm.send(@registration_ids, options)
                    Rails.logger.info "== push_notification_sent_to: #{@registration_ids} =="
                    Rails.logger.info "== push_notification_response: #{response} =="
                  else
                    Rails.logger.info "== We didn't send the push notification. =="
                  end
                end

                def fetch_device_tokens(user)
                  user && user.push_notification_devices && user.push_notification_devices.each do |device|
                    @registration_ids << device.token
                  end
                end
              end
            
          

まとめ

サーバーサイドでFCMへのインタフェースを用意し、Push通知を送る方法を試してみました。
なお、Ruby committerの方が、andpushというFCMのクライアントgemを提供しています。
gem fcmより優れているようですが、コードを書いた後にandpushの存在を知ったので、ここではgem fcmを使っています。
ご興味がある方は以下をご参照ください。
gem andpush
国内外にチームがあり、費用感や品質、スピード、様々なオーダーに対して、
柔軟にカスタマイズしてチームを作ります。
まずはお気軽にお見積もり依頼からご連絡ください。
お見積もり依頼はこちら