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
1.6k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
FirebaseNotification,RemoteConfigでユーザセグメントごとにプッシュ通知を実装する
FirebaseMeetup#13にて発表させていただいた資料です
yu mitsuhori
May 28, 2019
More Decks by yu mitsuhori
See All by yu mitsuhori
【DroidKaigi版】ReactNativeとKotlinで叶える夢のリアルタイム音声配信
youmitsu
1
3.3k
ReactNativeとKotlinで叶える夢のリアルタイム音声配信
youmitsu
1
930
stand.fm(Android)におけるreact-native-track-playerの改善
youmitsu
1
2.3k
TargetSdkVersion29で BottomNavigationが点滅する件
youmitsu
1
1.6k
リリース前のリグレッションテストをUIテストで自動化、1年間運用した話
youmitsu
2
430
New features in RemoteConfig, Analytics at Google I/O 2019
youmitsu
1
780
Report from Google I/O 2019
youmitsu
1
120
OSSにコントリビュートした話
youmitsu
1
120
初めて自作ViewのAARライブラリを公開した話
youmitsu
1
440
Other Decks in Programming
See All in Programming
What's New in Android 2026
veronikapj
0
250
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
450
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
370
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
600
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
170
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
380
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
130
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4k
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
540
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
240
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.3k
Speed Design
sergeychernyshev
33
2k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
460
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
The Cost Of JavaScript in 2023
addyosmani
55
10k
How to build a perfect <img>
jonoalderson
1
5.9k
Raft: Consensus for Rubyists
vanstee
141
7.6k
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