AndroidのPush通知でFcmpush gemを使ってみた

# はじめに
皆様、こんにちは！
佐久間まゆちゃんのプロデューサーの[@hiroki_tanaka](https://note.com/hiroki_tanaka)です。

最近、Railsアプリから送信しているAndroidアプリ向けのPush通知をGCMからFCMに移行しました。
その際に[fcmpush](https://github.com/miyataka/fcmpush)というFCM送信処理を扱うGemを使用したので、使い方を紹介させてください。

# 利用環境
- Ruby 2.7.2
- Rails 6.1.7

# FCM通知とは
FCMとはFirebase Cloud Messagingのことで、サーバからAndroidアプリにPush通知を送信できるようにするサービスです。
FCMを使用してPush通知を送信することで、ユーザーにアプリのアピールやイベント毎のお知らせなどを行うことができ、アプリへの再訪率や定着率の向上に繋げることができます。

FCMの前身としてGCMという通知処理がありましたが2019年4月にサポート終了しているため、2022年現在ではGCMの使用は非推奨でFCMへの移行が必要となっています。
(新規アプリでPush通知を作成する場合はFCM一択です。)
※FirebaseのProjectのページにも`最新の Firebase Cloud Messaging API（V1）を使用してください。`をいう記載があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105636/d2b7482f-fd12-d5a8-077e-2b4453ef1917.png)

今回はFCM送信処理にfcmpushというgemを使用致しました。
fcmpushはRails上でFCM通知の送信処理を簡単に扱うことが出来、パフォーマンスに優れているだけでなくバッチ送信処理など便利な機能も持っているgemです。
(ただし、fcmpushはGCMはサポート対象外です。)

https://github.com/miyataka/fcmpush


# fcmpushの導入方法
### 1. fcmpushのgemインストール
何はともあれfcmpushをインストールします。

- Gemfileに下記を記載し、`bundle install`を実行致します。
```
gem 'fcmpush'
```

### 2. Firebase Projectの「プロジェクトの設定」 -> 「サービスアカウント」から`新しい秘密鍵の生成`を行う。
どのFirebase ProjectからFCM通知を送るか設定するために下記から秘密鍵をダウンロードします。

![スクリーンショット 2022-11-30 16.04.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105636/94daf71f-04dc-d751-eed7-f0bc16a564b7.png)

### 3. 秘密鍵に記載されている情報を基に設定ファイルの`fcmpush.rb`を作成する。
秘密鍵に記載されている`アカウントタイプ`・`クライアントID`・`クライアントEメール`・`プライベートキー`を記載します。
また、秘密鍵には記載されていませんがサーバーキーも記載します。

```config/initializers/fcmpush.rb
Fcmpush.configure do |config|
  ENV['GOOGLE_ACCOUNT_TYPE'] = 'service_account' # service_account固定値です。
  ENV['GOOGLE_CLIENT_ID'] = '12345678910'
  ENV['GOOGLE_CLIENT_EMAIL'] = 'example@example.iam.gserviceaccount.com'
  ENV['GOOGLE_PRIVATE_KEY'] = '-----BEGIN PRIVATE KEY-----から始まる文言'
  config.server_key = 'server key'
end
```

server_keyは「プロジェクトの設定」 -> 「Cloud Messaging」に記載あります。
![スクリーンショット 2022-11-30 21.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105636/d32ae42b-4159-e5f8-cf53-6557578be2d5.png)

または、秘密鍵ファイルをインポートする形式でも大丈夫です。
```config/initializers/fcmpush.rb
Fcmpush.configure do |config|
    config.json_key_io = "#{Rails.root}/path/to/service_account_credentials.json"
    config.server_key = 'server key'
end
```

### 4. fcmpushを利用するアプリケーションコードの作成
下記のようにfcmpushをrequireし、FCM経由で送信処理を行うように設定します。

```ruby
require 'fcmpush'

project_id = 'Firebase ProjectのID'
token = '送信するデバイスのtoken'

client = Fcmpush.new(project_id)

fcm_json = {
    message: {
        token: token,
        android: {
            notification: {
                title: 'Push通知のタイトル',
                body: 'Push通知のBody',
                sound: 'default',
                icon: 'default'
              }
            }
          }
        }

client.push(fcm_json)
```

使用できるパラメータに関しては下記のページにまとまっています。
[REST Resource: projects.messages](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages)

### 5. 完成！！
上記の処理を呼び出せば、無事Push通知が送信されます。

# おわりに
fcmpush gemを利用することで非常に簡単にFCM経由でPush通知を送信する事ができました。
正直、ここまで簡単に出来るとは思わなかったので驚きました。

fcmpushはバッチ送信処理機能やtopicのサブスクライブ機能など他にも便利な機能があるので、今後より一層活用して行きたいです。

# 参考
- [fcmpush](https://github.com/miyataka/fcmpush)
- [アプリにおけるプッシュ通知の技術選定](https://zenn.dev/miyataka/articles/push-notification_services)