Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FirebaseNotification,RemoteConfigでユーザセグメントごとにプッシュ通知を実装する

 FirebaseNotification,RemoteConfigでユーザセグメントごとにプッシュ通知を実装する

FirebaseMeetup#13にて発表させていただいた資料です

yu mitsuhori

May 28, 2019
Tweet

More Decks by yu mitsuhori

Other Decks in Programming

Transcript

  1. アジェンダ 1. 自己紹介 2. この発表で紹介すること 3. TL;DR 4. 背景 5.

    手法の解説 6. 実装方法 7. メリット、デメリット 8. まとめ 2 2
  2. 自己紹介 - 三堀 裕(みつほり ゆう) - 養命酒(youmeee, youmitsu) - メインはAndroid

    - 新宿の隣でヘルスケア系アプリを開発しています。 - Github: youmitsu - Twitter: @1013Youmeee 3 3
  3. 実装するきっかけ - アクティブユーザー約80万(Android)のアプリ - アクティブ率向上施策として、FirebaseNotificationによるリモートプッシュ通知を導 入することになる - プッシュ通知を全ユーザに対し、同時に送信してしまう - アプリを起動した際にAPIコールが走る

    => 膨大なリクエスト。。 - サーバサイド側で準備ができておらず、一時間ほどアクセスできない状態になって しまった。 8 8 サーバ負荷を抑えるための対応をする必要がある
  4. 改善前の方法(プッシュ送信) 12 12 送信担当者 Notification Composer アプリ 通知情報の作成 (フィルターなし) 通知送信

    通知の表示 フィルタリングしていないた め全ユーザに 一斉送信されてしまってい た
  5. 改善後の方法 (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は分割数
  6. { AppID: 12345, user_group: 3 } 14 14 1 2

    3 or user_group一覧 3 3 RemoteConfig App AppID(12345) UserProperty (Analytics) イメージ図:Config値をUserPropertyにセット 取得 登録
  7. 改善後の方法(プッシュ送信) 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) 通知 表示 通知 表示 通知 表示 送信担当者
  8. 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リストを返す
  9. 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を定義
  10. 実装(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にセット
  11. メリット - 工数が少なくすむ - コストも抑えられる - Notification, RemoteConfig, Analyticsは無料 -

    別チームのリソースを借りずに済む - バッチを書いたり、サーバサイドの開発をする必要がない 26 26
  12. デメリット - 長期的な運用に向いていない - Notification Composer上でやることが多い - ヒューマンエラーが起こりやすい - UserPropertyの設定はラグが多少あるため、UserGroupのフィルターに引っかから

    ないユーザが出てくる(通知が送られない) - おそらく使い方間違ってる - UserPropertyは分析用のもの。通知の負荷分散のために使うものではない 27 27