Firebase Cloud Messagingでターゲティングしたプッシュ通知を送信できないか検討したログ
Firebase Cloud Messaging(FCM)を使うと、Webブラウザのコンソール経由からのプッシュ通知送信ができます。
このWebコンソールは、簡単なターゲティングもできます。
たとえばアプリバージョンx.x.x以上/以下のユーザーだけにプッシュを送る、などの指定が可能です。
今回検討したのは、社内DBの中の条件をもとにターゲティングができないか?という要件です。
要するに、ReproみたいなことをFCMでできないか?という話です。
課題
特定のユーザー属性にだけプッシュ通知を送りたい、という要件があるとしましょう。
たとえばユーザー登録してから一年以上たっているとか、特定のアクションを行なっているとかです。
ここで問題になるのが、FCMは社内DBの情報にアクセスできないことです。
Firebase上でDB管理しているサービスなら連携できるかもしれませんが、
会社でつくってるアプリだったら基本的にFirebaseにバックグラウンド全お任せにする構成にはしてないはずです。
何らかの方法でFCMに社内DBの情報を連携する必要があります。
連携方法
FCMはオーディエンスのターゲティング方法を何種類か提供しています。
公式ブログがあるので、まずはここからはじめることをオススメします。
Firebase Summit 2022の動画で、同内容が話されています。
選択肢をまとめると、下記の連携方法があります。
- 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個までと上限厳しいところですかね。
なので、軽い気持ちで設定できなくて、サービスのコアとなる条件だけに絞って使うしかない気がします。
たとえば有料ユーザーか無料ユーザーかの区別など。
Topics
トピックを使ったターゲティングもできます。
これはPub/Subモデルとして設計されてるようなので、ユーザー側が能動的に登録する場合に使いやすそうです。
公式ドキュメントによると、こんな感じでトピックに登録できるみたいです。
Messaging.messaging().subscribe(toTopic: "interestInSomething")
トピック自体の管理画面はなさそう?
SDK経由でサーバーサイドで操作してもらわないといけなさそうです。
また汎用的なターゲティングプッシュに対しては、仕様的にそういう機能じゃない雰囲気を感じます。
Imported Segments(BigQuery)
BigQueryとFCMを連携させる仕組みがImported Segmentsです。
Firebase Summit 2020で登場したみたいです。
BigQuery上のデータをもとにプッシュ通知をターゲティングできます。
社内DB→BigQuery→FCM
とデータ連携することで、柔軟なターゲティングが可能です!
プッシュ通知のターゲットになるユーザー一覧をサーバーサイドでつくって、それをBigQueryにあげてあげれば良さそうです。
公式ドキュメントはこちら。
これはいける!と思ったんですが、大きな課題がありました。
社内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とは
公式ドキュメントがありました。
ざっくり書くと、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