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. FirebaseNotification,RemoteConfigで
    ユーザセグメントごとにプッシュ通知を実装
    する
    Firebase Meetup at DeNA
    @1013Youmeee

    View Slide

  2. アジェンダ
    1. 自己紹介
    2. この発表で紹介すること
    3. TL;DR
    4. 背景
    5. 手法の解説
    6. 実装方法
    7. メリット、デメリット
    8. まとめ
    2
    2

    View Slide

  3. 自己紹介
    - 三堀 裕(みつほり ゆう)
    - 養命酒(youmeee, youmitsu)
    - メインはAndroid
    - 新宿の隣でヘルスケア系アプリを開発しています。
    - Github: youmitsu
    - Twitter: @1013Youmeee
    3
    3

    View Slide

  4. この発表で紹介すること
    - RemoteConfigで分割されたユーザセグメントに対して、各セグメントごとにインター
    バル通知をFirebaseNotificationで送信する方法と背景について
    ※実装の話などAndroidの話が多めになると思いますが、iOSでも実装が可能なの
    で参考程度に聞いていただければと思います
    4
    4

    View Slide

  5. 今回使用するサービス
    5
    5
    Notification
    (FCM)
    Remote Config
    User Property
    (Analytics)

    View Slide

  6. TL;DR
    1. RemoteConfigの値をUserPropertyに登録する
    2. NotificationComposerからUserPropertyを指定してプッシュ配信する
    ※iOSでも同様の手順で実装可能
    6

    View Slide

  7. 背景
    7

    View Slide

  8. 実装するきっかけ
    - アクティブユーザー約80万(Android)のアプリ
    - アクティブ率向上施策として、FirebaseNotificationによるリモートプッシュ通知を導
    入することになる
    - プッシュ通知を全ユーザに対し、同時に送信してしまう
    - アプリを起動した際にAPIコールが走る => 膨大なリクエスト。。
    - サーバサイド側で準備ができておらず、一時間ほどアクセスできない状態になって
    しまった。
    8
    8
    サーバ負荷を抑えるための対応をする必要がある

    View Slide

  9. 考えられた対応策
    - サーバのインスタンス数を増やす
    - 通知開封時に通信を走らせない
    - ユーザを分割し、回数を分けて送信する
    - サーバのインスタンス数を増やす必要がない(コストがかからない)
    - アプリチームだけで対応が可能
    - 実装工数が少なくできる
    9
    9

    View Slide

  10. Firebaseでユーザ分割とプッシュ送信を
    実現するには
    分割
    - RemoteConfigでユーザを均等に分割可能
    送信
    - CloudMessagingからフィルターとして指定可能なのは、
    右記の通り
    - RemoteConfig× UserProperty◯
    アプリで取得したRemoteConfigをUserPropertyとして
    登録することで、紐付けをする
    10
    10

    View Slide

  11. 実現方法の解説
    11

    View Slide

  12. 改善前の方法(プッシュ送信)
    12
    12
    送信担当者 Notification Composer アプリ
    通知情報の作成
    (フィルターなし)
    通知送信
    通知の表示
    フィルタリングしていないた
    め全ユーザに
    一斉送信されてしまってい

    View Slide

  13. 改善後の方法
    (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は分割数

    View Slide

  14. {
    AppID: 12345,
    user_group: 3
    }
    14
    14
    1
    2 3
    or
    user_group一覧
    3 3
    RemoteConfig
    App
    AppID(12345)
    UserProperty
    (Analytics)
    イメージ図:Config値をUserPropertyにセット
    取得
    登録

    View Slide

  15. 改善後の方法(プッシュ送信)
    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)
    通知
    表示
    通知
    表示
    通知
    表示
    送信担当者

    View Slide

  16. 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リストを返す

    View Slide

  17. 実装
    17

    View Slide

  18. ユーザ分割用のRemoteConfigを設定
    (条件作成)
    - 全ユーザを3分割するとする。
    - user_groupを均等に3つに分類
    - 各条件ごとに33%ずつ割り振る
    18 RemoteConfigの条件一覧画面
    RemoteConfigの条件作成画面
    ユーザ(ランダム%)を選択

    View Slide

  19. ユーザ分割用のRemoteConfigを設定
    (パラメータ定義)
    - パラメータキーはuser_groupに設定
    - 各条件ごとにConfig値を設定する
    19
    RemoteConfigのパラメータ設定画面

    View Slide

  20. 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を定義

    View Slide

  21. 実装(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にセット

    View Slide

  22. NotificationComposerから通知送信
    - ターゲットの部分で、user_groupを指定する(例:3)
    - 配信予定日時を指定して、「下書き保存」する
    22
    22

    View Slide

  23. 各user_groupごとにスケジューリングしておく
    - 各user_groupをターゲットにした通知を時間を分けてスケジューリングする
    - プッシュ送信間隔は、運用チームと相談して決める
    23

    View Slide

  24. 通知の受信
    24

    View Slide

  25. メリット・デメリット
    25

    View Slide

  26. メリット
    - 工数が少なくすむ
    - コストも抑えられる
    - Notification, RemoteConfig, Analyticsは無料
    - 別チームのリソースを借りずに済む
    - バッチを書いたり、サーバサイドの開発をする必要がない
    26
    26

    View Slide

  27. デメリット
    - 長期的な運用に向いていない
    - Notification Composer上でやることが多い
    - ヒューマンエラーが起こりやすい
    - UserPropertyの設定はラグが多少あるため、UserGroupのフィルターに引っかから
    ないユーザが出てくる(通知が送られない)
    - おそらく使い方間違ってる
    - UserPropertyは分析用のもの。通知の負荷分散のために使うものではない
    27
    27

    View Slide

  28. まとめ
    - Firebase Notificationで通知を送信するとき、RemoteConfigの値でフィルタリングが
    可能。インターバル通知を送信することもできる。
    - あまり推奨される方法ではないが、手っ取り早く実装することができる
    - User Propertyへの反映はラグが多少あるので、送信されないユーザが出てきてし
    まう点は要注意
    - 以下にサンプルをあげています
    - https://github.com/youmitsu/FirebaseAnalyticsSample
    28
    28

    View Slide

  29. Qiitaも書きました
    https://qiita.com/youmeee/items/7fe6d80e1d451bf9ed53
    29
    29

    View Slide