Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
FirebaseNotification,RemoteConfigでユーザセグメントご...
Search
yu mitsuhori
May 28, 2019
Programming
8
1.5k
FirebaseNotification,RemoteConfigでユーザセグメントごとにプッシュ通知を実装する
FirebaseMeetup#13にて発表させていただいた資料です
yu mitsuhori
May 28, 2019
Tweet
Share
More Decks by yu mitsuhori
See All by yu mitsuhori
【DroidKaigi版】ReactNativeとKotlinで叶える夢のリアルタイム音声配信
youmitsu
1
3.1k
ReactNativeとKotlinで叶える夢のリアルタイム音声配信
youmitsu
1
770
stand.fm(Android)におけるreact-native-track-playerの改善
youmitsu
1
2k
TargetSdkVersion29で BottomNavigationが点滅する件
youmitsu
1
1.5k
リリース前のリグレッションテストをUIテストで自動化、1年間運用した話
youmitsu
2
340
New features in RemoteConfig, Analytics at Google I/O 2019
youmitsu
1
610
Report from Google I/O 2019
youmitsu
1
76
OSSにコントリビュートした話
youmitsu
1
75
初めて自作ViewのAARライブラリを公開した話
youmitsu
1
350
Other Decks in Programming
See All in Programming
Haze - Real time background blurring
chrisbanes
1
510
Zoneless Testing
rainerhahnekamp
0
120
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
210
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
170
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
140
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
110
命名をリントする
chiroruxx
1
410
これが俺の”自分戦略” プロセスを楽しんでいこう! - Developers CAREER Boost 2024
niftycorp
PRO
0
190
useSyncExternalStoreを使いまくる
ssssota
6
1k
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
CSC305 Lecture 26
javiergs
PRO
0
140
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
A designer walks into a library…
pauljervisheath
204
24k
BBQ
matthewcrist
85
9.4k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Fireside Chat
paigeccino
34
3.1k
Side Projects
sachag
452
42k
How GitHub (no longer) Works
holman
311
140k
Rails Girls Zürich Keynote
gr2m
94
13k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Building an army of robots
kneath
302
44k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Bash Introduction
62gerente
608
210k
Transcript
FirebaseNotification,RemoteConfigで ユーザセグメントごとにプッシュ通知を実装 する Firebase Meetup at DeNA @1013Youmeee
アジェンダ 1. 自己紹介 2. この発表で紹介すること 3. TL;DR 4. 背景 5.
手法の解説 6. 実装方法 7. メリット、デメリット 8. まとめ 2 2
自己紹介 - 三堀 裕(みつほり ゆう) - 養命酒(youmeee, youmitsu) - メインはAndroid
- 新宿の隣でヘルスケア系アプリを開発しています。 - Github: youmitsu - Twitter: @1013Youmeee 3 3
この発表で紹介すること - RemoteConfigで分割されたユーザセグメントに対して、各セグメントごとにインター バル通知をFirebaseNotificationで送信する方法と背景について ※実装の話などAndroidの話が多めになると思いますが、iOSでも実装が可能なの で参考程度に聞いていただければと思います 4 4
今回使用するサービス 5 5 Notification (FCM) Remote Config User Property (Analytics)
TL;DR 1. RemoteConfigの値をUserPropertyに登録する 2. NotificationComposerからUserPropertyを指定してプッシュ配信する ※iOSでも同様の手順で実装可能 6
背景 7
実装するきっかけ - アクティブユーザー約80万(Android)のアプリ - アクティブ率向上施策として、FirebaseNotificationによるリモートプッシュ通知を導 入することになる - プッシュ通知を全ユーザに対し、同時に送信してしまう - アプリを起動した際にAPIコールが走る
=> 膨大なリクエスト。。 - サーバサイド側で準備ができておらず、一時間ほどアクセスできない状態になって しまった。 8 8 サーバ負荷を抑えるための対応をする必要がある
考えられた対応策 - サーバのインスタンス数を増やす - 通知開封時に通信を走らせない - ユーザを分割し、回数を分けて送信する - サーバのインスタンス数を増やす必要がない(コストがかからない) -
アプリチームだけで対応が可能 - 実装工数が少なくできる 9 9
Firebaseでユーザ分割とプッシュ送信を 実現するには 分割 - RemoteConfigでユーザを均等に分割可能 送信 - CloudMessagingからフィルターとして指定可能なのは、 右記の通り -
RemoteConfig× UserProperty◯ アプリで取得したRemoteConfigをUserPropertyとして 登録することで、紐付けをする 10 10
実現方法の解説 11
改善前の方法(プッシュ送信) 12 12 送信担当者 Notification Composer アプリ 通知情報の作成 (フィルターなし) 通知送信
通知の表示 フィルタリングしていないた め全ユーザに 一斉送信されてしまってい た
改善後の方法 (Config値をUserPropertyにセット) 13 13 アプリ Firebase RemoteConfig Firebase Analytics Config値(user_group)
取得 user_groupをUserPropertyに登録 UserPropertyにuser_group の値を登録 user_group(1~N)返却 user_groupを定 義しておく (1~Nのどれか) ※Nは分割数
{ AppID: 12345, user_group: 3 } 14 14 1 2
3 or user_group一覧 3 3 RemoteConfig App AppID(12345) UserProperty (Analytics) イメージ図:Config値をUserPropertyにセット 取得 登録
改善後の方法(プッシュ送信) 15 15 Notification 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) 通知 表示 通知 表示 通知 表示 送信担当者
16 App user_group: 1 FCM イメージ図:プッシュ送信 Notification 【通知情報】 user_group: 1
【通知情報】 user_group: 2 【通知情報】 user_group: 3 App user_group: 2 App user_group: 3 UserProperty user_groupがxの appidリストを返す
実装 17
ユーザ分割用のRemoteConfigを設定 (条件作成) - 全ユーザを3分割するとする。 - user_groupを均等に3つに分類 - 各条件ごとに33%ずつ割り振る 18 RemoteConfigの条件一覧画面
RemoteConfigの条件作成画面 ユーザ(ランダム%)を選択
ユーザ分割用のRemoteConfigを設定 (パラメータ定義) - パラメータキーはuser_groupに設定 - 各条件ごとにConfig値を設定する 19 RemoteConfigのパラメータ設定画面
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" } 20 app配下の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) } } 21 21 ApplicationクラスのonCreate()内に以下を記述 Debugビルド時 毎回Config値を取得する ようにする Releaseビルド時 Config有効時間をデフォ ルト(12時間)に設定 FetchしたConfigのキャッ シュ有効時間の設定 ローカル内の デフォルト値を設定 Configの取得後の コールバックを定義 RemoteConfigの値を 取得 user_groupの値を取得し、 UserPropertyにセット
NotificationComposerから通知送信 - ターゲットの部分で、user_groupを指定する(例:3) - 配信予定日時を指定して、「下書き保存」する 22 22
各user_groupごとにスケジューリングしておく - 各user_groupをターゲットにした通知を時間を分けてスケジューリングする - プッシュ送信間隔は、運用チームと相談して決める 23
通知の受信 24
メリット・デメリット 25
メリット - 工数が少なくすむ - コストも抑えられる - Notification, RemoteConfig, Analyticsは無料 -
別チームのリソースを借りずに済む - バッチを書いたり、サーバサイドの開発をする必要がない 26 26
デメリット - 長期的な運用に向いていない - Notification Composer上でやることが多い - ヒューマンエラーが起こりやすい - UserPropertyの設定はラグが多少あるため、UserGroupのフィルターに引っかから
ないユーザが出てくる(通知が送られない) - おそらく使い方間違ってる - UserPropertyは分析用のもの。通知の負荷分散のために使うものではない 27 27
まとめ - Firebase Notificationで通知を送信するとき、RemoteConfigの値でフィルタリングが 可能。インターバル通知を送信することもできる。 - あまり推奨される方法ではないが、手っ取り早く実装することができる - User Propertyへの反映はラグが多少あるので、送信されないユーザが出てきてし
まう点は要注意 - 以下にサンプルをあげています - https://github.com/youmitsu/FirebaseAnalyticsSample 28 28
Qiitaも書きました https://qiita.com/youmeee/items/7fe6d80e1d451bf9ed53 29 29