FirebaseMeetup#13にて発表させていただいた資料です
FirebaseNotification,RemoteConfigでユーザセグメントごとにプッシュ通知を実装するFirebase Meetup at DeNA@1013Youmeee
View Slide
アジェンダ1. 自己紹介2. この発表で紹介すること3. TL;DR4. 背景5. 手法の解説6. 実装方法7. メリット、デメリット8. まとめ22
自己紹介- 三堀 裕(みつほり ゆう)- 養命酒(youmeee, youmitsu)- メインはAndroid- 新宿の隣でヘルスケア系アプリを開発しています。- Github: youmitsu- Twitter: @1013Youmeee33
この発表で紹介すること- RemoteConfigで分割されたユーザセグメントに対して、各セグメントごとにインターバル通知をFirebaseNotificationで送信する方法と背景について※実装の話などAndroidの話が多めになると思いますが、iOSでも実装が可能なので参考程度に聞いていただければと思います44
今回使用するサービス55Notification(FCM)Remote ConfigUser Property(Analytics)
TL;DR1. RemoteConfigの値をUserPropertyに登録する2. NotificationComposerからUserPropertyを指定してプッシュ配信する※iOSでも同様の手順で実装可能6
背景7
実装するきっかけ- アクティブユーザー約80万(Android)のアプリ- アクティブ率向上施策として、FirebaseNotificationによるリモートプッシュ通知を導入することになる- プッシュ通知を全ユーザに対し、同時に送信してしまう- アプリを起動した際にAPIコールが走る => 膨大なリクエスト。。- サーバサイド側で準備ができておらず、一時間ほどアクセスできない状態になってしまった。88サーバ負荷を抑えるための対応をする必要がある
考えられた対応策- サーバのインスタンス数を増やす- 通知開封時に通信を走らせない- ユーザを分割し、回数を分けて送信する- サーバのインスタンス数を増やす必要がない(コストがかからない)- アプリチームだけで対応が可能- 実装工数が少なくできる99
Firebaseでユーザ分割とプッシュ送信を実現するには分割- RemoteConfigでユーザを均等に分割可能送信- CloudMessagingからフィルターとして指定可能なのは、右記の通り- RemoteConfig× UserProperty◯アプリで取得したRemoteConfigをUserPropertyとして登録することで、紐付けをする1010
実現方法の解説11
改善前の方法(プッシュ送信)1212送信担当者 Notification Composer アプリ通知情報の作成(フィルターなし)通知送信通知の表示フィルタリングしていないため全ユーザに一斉送信されてしまっていた
改善後の方法(Config値をUserPropertyにセット)1313アプリFirebaseRemoteConfigFirebaseAnalyticsConfig値(user_group)取得user_groupをUserPropertyに登録UserPropertyにuser_groupの値を登録user_group(1~N)返却user_groupを定義しておく(1~Nのどれか)※Nは分割数
{AppID: 12345,user_group: 3}141412 3oruser_group一覧3 3RemoteConfigAppAppID(12345)UserProperty(Analytics)イメージ図:Config値をUserPropertyにセット取得登録
改善後の方法(プッシュ送信)1515Notification Composerアプリuser_group=1通知情報の作成(user_group=1)通知情報の作成(user_group=2)通知情報の作成(user_group=N)アプリuser_group=2アプリuser_group=Nスケジューリング通知送信(user_group=1)通知送信(user_group=2)通知送信(user_group=N)通知表示通知表示通知表示送信担当者
16Appuser_group: 1FCMイメージ図:プッシュ送信Notification【通知情報】user_group: 1【通知情報】user_group: 2【通知情報】user_group: 3Appuser_group: 2Appuser_group: 3UserPropertyuser_groupがxのappidリストを返す
実装17
ユーザ分割用のRemoteConfigを設定(条件作成)- 全ユーザを3分割するとする。- user_groupを均等に3つに分類- 各条件ごとに33%ずつ割り振る18 RemoteConfigの条件一覧画面RemoteConfigの条件作成画面ユーザ(ランダム%)を選択
ユーザ分割用のRemoteConfigを設定(パラメータ定義)- パラメータキーはuser_groupに設定- 各条件ごとにConfig値を設定する19RemoteConfigのパラメータ設定画面
Firebase関連のdependenciesを定義※Androidの場合dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:28.0.0'…implementation "com.google.firebase:firebase-core:16.0.9"implementation "com.google.firebase:firebase-config:17.0.0"implementation "com.google.firebase:firebase-messaging:18.0.0"}20app配下のbuild.gradleにFirebase関連のdependenciesを定義
実装(RemoteConfingの値を取得&UserPropertyの設定)※Androidの場合val config = FirebaseRemoteConfigSettings.Builder().setMinimumFetchIntervalInSeconds((if (BuildConfig.DEBUG) 0 else 60 * 60 * 12)).build()val remoteConfig = FirebaseRemoteConfig.getInstance()remoteConfig.apply {setConfigSettingsAsync(config)setDefaults(R.xml.remote_config_default_value)fetch().addOnCompleteListener { fetchedTask ->if (fetchedTask.isSuccessful) activate()val userGroup = getString("user_group")mFirebaseAnalytics.setUserProperty("user_group", userGroup)}}2121ApplicationクラスのonCreate()内に以下を記述Debugビルド時毎回Config値を取得するようにするReleaseビルド時Config有効時間をデフォルト(12時間)に設定FetchしたConfigのキャッシュ有効時間の設定ローカル内のデフォルト値を設定Configの取得後のコールバックを定義RemoteConfigの値を取得user_groupの値を取得し、UserPropertyにセット
NotificationComposerから通知送信- ターゲットの部分で、user_groupを指定する(例:3)- 配信予定日時を指定して、「下書き保存」する2222
各user_groupごとにスケジューリングしておく- 各user_groupをターゲットにした通知を時間を分けてスケジューリングする- プッシュ送信間隔は、運用チームと相談して決める23
通知の受信24
メリット・デメリット25
メリット- 工数が少なくすむ- コストも抑えられる- Notification, RemoteConfig, Analyticsは無料- 別チームのリソースを借りずに済む- バッチを書いたり、サーバサイドの開発をする必要がない2626
デメリット- 長期的な運用に向いていない- Notification Composer上でやることが多い- ヒューマンエラーが起こりやすい- UserPropertyの設定はラグが多少あるため、UserGroupのフィルターに引っかからないユーザが出てくる(通知が送られない)- おそらく使い方間違ってる- UserPropertyは分析用のもの。通知の負荷分散のために使うものではない2727
まとめ- Firebase Notificationで通知を送信するとき、RemoteConfigの値でフィルタリングが可能。インターバル通知を送信することもできる。- あまり推奨される方法ではないが、手っ取り早く実装することができる- User Propertyへの反映はラグが多少あるので、送信されないユーザが出てきてしまう点は要注意- 以下にサンプルをあげています- https://github.com/youmitsu/FirebaseAnalyticsSample2828
Qiitaも書きましたhttps://qiita.com/youmeee/items/7fe6d80e1d451bf9ed532929