👻

Firebase Cloud Messagingでターゲティングしたプッシュ通知を送信できないか検討したログ

2024/07/12に公開

Firebase Cloud Messaging(FCM)を使うと、Webブラウザのコンソール経由からのプッシュ通知送信ができます。

このWebコンソールは、簡単なターゲティングもできます。
たとえばアプリバージョンx.x.x以上/以下のユーザーだけにプッシュを送る、などの指定が可能です。

今回検討したのは、社内DBの中の条件をもとにターゲティングができないか?という要件です。
要するに、ReproみたいなことをFCMでできないか?という話です。

課題

特定のユーザー属性にだけプッシュ通知を送りたい、という要件があるとしましょう。
たとえばユーザー登録してから一年以上たっているとか、特定のアクションを行なっているとかです。
ここで問題になるのが、FCMは社内DBの情報にアクセスできないことです。

Firebase上でDB管理しているサービスなら連携できるかもしれませんが、
会社でつくってるアプリだったら基本的にFirebaseにバックグラウンド全お任せにする構成にはしてないはずです。

何らかの方法でFCMに社内DBの情報を連携する必要があります。

連携方法

FCMはオーディエンスのターゲティング方法を何種類か提供しています。
公式ブログがあるので、まずはここからはじめることをオススメします。

https://firebase.blog/posts/2022/12/targeting-audiences-with-fcm/

Firebase Summit 2022の動画で、同内容が話されています。

https://www.youtube.com/watch?v=pP044hR6zNQ

選択肢をまとめると、下記の連携方法があります。

  • Analytics-Based Targeting(Google Analytics)
    • デフォルトユーザープロパティ
    • カスタムユーザープロパティ
    • ユーザーオーディエンス
  • Topics
  • Imported Segments(BigQuery)

それぞれ簡単に解説していきます。

Analytics-Based Targeting(Google Analytics)

FCMとGoogle Analyticsは連携できます。
Google Analyticsで設定しているユーザープロパティを用いて、ターゲティングプッシュが送れます。

アプリバージョン・国籍・使用言語はデフォルトユーザープロパティとして収集されているので、デフォルトで使うことができます。
カスタムで属性が欲しい場合、アプリからこのようにカスタムユーザープロパティを設定する必要があります。
(それとFirebase側の設定も要ります)

Analytics.setUserProperty("true", forName: "doSomething")

またユーザーオーディエンスを設定することもできます。
これは特定の条件を満たしたグループで、Firebase上で設定します。

この連携機能は使いやすいので、採用してもいいかなと感じました。
注意点としてはユーザーのカスタムプロパティ(ディメンジョン)が25個までと上限厳しいところですかね。

https://support.google.com/analytics/answer/14240153

なので、軽い気持ちで設定できなくて、サービスのコアとなる条件だけに絞って使うしかない気がします。
たとえば有料ユーザーか無料ユーザーかの区別など。

Topics

トピックを使ったターゲティングもできます。
これはPub/Subモデルとして設計されてるようなので、ユーザー側が能動的に登録する場合に使いやすそうです。

公式ドキュメントによると、こんな感じでトピックに登録できるみたいです。

Messaging.messaging().subscribe(toTopic: "interestInSomething")

トピック自体の管理画面はなさそう?
SDK経由でサーバーサイドで操作してもらわないといけなさそうです。
また汎用的なターゲティングプッシュに対しては、仕様的にそういう機能じゃない雰囲気を感じます。

Imported Segments(BigQuery)

BigQueryとFCMを連携させる仕組みがImported Segmentsです。
Firebase Summit 2020で登場したみたいです。

BigQuery上のデータをもとにプッシュ通知をターゲティングできます。

社内DB→BigQuery→FCM

とデータ連携することで、柔軟なターゲティングが可能です!
プッシュ通知のターゲットになるユーザー一覧をサーバーサイドでつくって、それをBigQueryにあげてあげれば良さそうです。
公式ドキュメントはこちら。

https://firebase.google.com/docs/projects/import-segments

これはいける!と思ったんですが、大きな課題がありました。
社内DB→BigQueryにデータをアップロードするのは、バッチ読み込みなどで対応可能でした。
問題はBigQuery→FCMの連携でした。

Imported Segmentsを有効にするために、まずFirebaseコンソールから連携を有効にします。

すると firebase_imported_segments というデータセットが作成されて、

  • SegmentMemberships
  • SegmentMetadata

という2つのテーブルがデフォルトで格納されています。
SegmentMembershipsのスキーマなんですが、下記になっています。

[
  {
    "name": "instance_id",
    "type": "STRING"
  },
  {
    "name": "segment_labels",
    "type": "STRING",
    "mode": "REPEATED"
  },
  {
    "name": "update_time",
    "type": "TIMESTAMP"
   }
]

ここで instance_id というプロパティが要求されます。
このIDがユーザー識別子になる訳なんですが、何を詰めればいいのでしょうか?
こう書いてあります。

instance_id: 特定のアプリのインストールに使用される Firebase インストール ID。セグメントに含めるアプリ インストールごとにインストール ID を取得し、その値をこのフィールドに入力する必要があります。

なるほどなるほど。
FirebaseインストールIDとは?

インストールIDとは

公式ドキュメントがありました。

https://firebase.google.com/docs/projects/manage-installations

ざっくり書くと、Firebaseのサービス内におけるユーザーIDという理解で良さそうです。
かつてはインスタンスIDという識別子を使っていた模様ですが、そちらの利用は現在非推奨となっていました。
インストールIDはインスタンスIDに互換性がある模様です。

FCMでセグメントを使うためには、このFID(FirebaseインストールID)が必要となるわけなんですが、これを収集する必要があり、それなりにハードルが高いです。
FCMトークンをサーバーサイドに送る要領で、アプリからFIDを送って、ユーザー情報と紐付けないといけないので、こんな連携になります。

モバイルアプリ→社内DB→BigQuery→FCM

またFIDは機種変更やアプリ削除を考慮する必要があります。
結局検討した結果、FIDの管理がハードルになって、Imported Segmentsの利用は見送りました。
ここが何らかの手段で自動連携になれば、Reproの代替ツールになりうると思うんですが、キツそうな気もします。

Firebase Summit 2022の動画では、BigQueryへのインポートは何か雰囲気でやってますが、実際のユースケースだとだいぶしんどいと思われます。
正直がんばってFID収集して管理するぐらいなら、サーバーサイドでもうFCMトークン使ってプッシュ送っちゃえばええやん、と思いました。

まとめ

以上、FCMでターゲティングする場合の選択肢を検討してきました。
最後に一覧でメリデメをまとめて終わりにします。
何かの参考になれば幸いです。

方法 メリット デメリット
Analytics-Based Targeting 使いやすい カスタムプロパティの上限が厳しい
Topics 比較的使いやすい トピックの管理画面がないのと用途がPub/Sub想定
Imported Segments なんでもできる FIDの収集のハードルが高すぎる

(了)

Discussion