Firebase Remote Configの紹介と必須知識
はじめに
皆さんこんにちは、株式会社エムアイ・ラボのエンジニアです!
スマートフォンアプリのプロジェクトでFirebase Remote Config(以下FRC)を新しく導入する機会がありました。
FRCを知らない方向けに、利用する上で知っておくべきことについて共有できればと思います。
書かれていること
- FRCの概要
- FRCで使われる用語
書かれていないこと
- FRCの使い方
- 使い方の情報は陳腐化しやすい且つケースにより全く異なるので、その時の最新のドキュメントを確認いただければと思います。
- Firebase ドキュメント -Remote Config
FRCとは
何者なのか(what)
- Firebaseが提供しているサービスのひとつです。
- FRCでリモートの設定を変更することで、アプリをリリースせずにその変更を反映させることができます。
なぜ使うのか(why)
リモートで設定を変更して、それを反映させるサービスは他にもあります。
FRCを選ぶ理由は以下の特徴にあります。
特徴1: ユーザーごとに違う設定が可能
通常、アプリ側で設定値を使い分けるときにロジックを作成すると思いますが、FRCではノーコードで実現できます。
例えば、iOSでは表示するがAndroidでは表示しないなどの条件設定が可能です。
更に、Userの10%にだけ表示させるといったことも簡単に可能です。
特徴2: コストがかからない
無料で使用可能です。
更に、アクティブユーザー数の制限も無いのも大きなポイントです。
(※2024年2月26日現在)
用語定義
技術習得には独自の仕組みや用語を抑えることが重要です。
FRCを使用するうえで知っておくべき用語定義を列挙していきます。
Remote Configテンプレート
- FRCで使われるJSON形式のデータです。
- パラメータと条件をセットで記述して更新します。
- Firebaseのコンソールからマウスでポチポチせずとも、事前にテンプレートを作成しておけばそれをアップロードするだけで設定反映が可能です。
- Firebase Admin SDKを使用している場合、FRCの設定変更のときに使用します。
こちらはテンプレートの例です。
{
"conditions": [
{
"name": "isIOS", // 条件名
"expression": "device.os == 'ios'", // 条件式
"tagColor": "INDIGO" // タグ
},
{
"name": "isAndroid",
"expression": "device.os == 'android'",
"tagColor": "ORANGE"
}
],
"parameters": {
"testPlatform": { // Key名
"defaultValue": {
"value": "Unknownです" // 設定値
},
"conditionalValues": {
"isIOS": { // 条件名
"value": "iOSです" // 設定値
},
"isAndroid": {
"value": "Androidです"
}
},
"valueType": "STRING" // 設定値の型
}
},
"parameterGroups": {
"saleSettings": { // グループ名
"parameters": {
"isSpringSale": { // Key名
"defaultValue": {
"value": "false" // 設定値
},
"valueType": "BOOLEAN" // 設定値の型
},
"discountRate": {
"defaultValue": {
"value": 50
},
"valueType": "NUMBER"
}
}
}
}
}
テンプレート作成のコツ
Firebase Admin SDKで設定値を更新するときはテンプレートの作成が必要で、ロジックで作ることが多いと思います。
そのときのコツを以下に記載します。
- FRCのコンソールで設定を作成します。
- パラメータを追加する部分の縦3点リーダーから「現在の構成ファイルをダウンロード」を選択します。
- ダウンロードしたものを参考に、JSONを組み立てるロジックを作成します。
etag
こちらもFRC独自の用語ではありませんが紹介します。
- Remote Configテンプレートのバージョニングで使用されます。
- Firebase Admin SDKでテンプレートを使って更新する場合、現在のetagを正しく設定しないと更新ができません。
- フォーマットは
etag-<project number>-<version number>
です。- 例えばproject numberが1111222233334444で、過去に2回更新したことがある場合、現在のetagは"etag-1111222233334444-3"になります。
最小フェッチ間隔
- リモートから最新のデータを取得する間隔の設定です。
- 前回の取得から設定した秒数より早く取得しようとした場合は、リモートへのアクセスは発生しません。
- 例えば最小フェッチ間隔が60秒のとき、前回fetchAPIを叩いてから30秒でもう一度fetchAPIを叩いたとき、リモートへのアクセスは発生しません。
- デフォルト値と本番環境推奨値は12時間です。
- 1秒の設定も可能です。
- 主に開発時に使用します。
スロットル処理
FRC独自の用語ではありませんが、注意が必要なのでこちらで紹介します。
- FRCのリモートへのアクセスが殺到すると、Firebaseが処理しきれなくなりエラーが返るようになります。このことをスロットル処理と呼びます。
- スロットル処理されるまでの具体的な数値ですが、残念ながら公式からの発表はありません。
- 最小フェッチ間隔を公式が推奨している12時間に設定するのが無難と思われます。
- 詳細はドキュメントをご覧ください。
- リアルタイムで反映させたい場合、後述のFRC Realtime APIを使用してください。
Realtime API
- 2023年5月に公開された新しめの機能です。
- 今まではFRCで設定を変更しても反映されるまで最長12時間かかりましたが、これを使用することで即時反映ができるようになりました。
- 詳細はドキュメントをご覧ください。
パラメータグループ
- 設定値をグループで分けることが可能です。
- ディレクトリごとに分けて管理するイメージです。
- パラメータが多くなってきたときに利用します。
以下のようなメリットを享受できます。
- 設定をまとめてできるようになります。
- 設定コストの削減
- 設定ミスの防止
- 運用・管理がやりやすくなります。
格納可能なデータ型について
4つの型
以下の4つがサポートされています。
- String
- Boolean
- Number
- JSON
格納するデータがグルーピングできる場合、プリミティブ型ではなくJSONでまとめて管理するのがスマートだと思います。
String格納の応用
2024年2月26日現在、stringの合計長は1,000,000文字です。
普通に考えたら使い切れないと思います。
ここにHTMLやJavaScriptを仕込み、クライアント側でパースすることで使用することが可能です。
これを利用すれば、HTMLをユーザーごとに切り替えたり、内容の変更・修正がアプリリリース無しで実現できます。
(JavaScriptを外部から取得して実行するのはかなり怖いですが)
まとめ
アプリのリリースは審査などもあり大変な作業です。
それをせずとも自由にアプリの設定を切り替えることができ、条件の設定も簡単かつ柔軟に設定できるのでとても便利なサービスです。
アプリの設定値をリモートに持つときの選択肢の一つになると思います。
採用情報
エムアイ・ラボでは一緒に開発に携わってくれるエンジニアを積極的に採用中です!
未経験エンジニアの方も募集しております!
(経験者の方、他職種も募集中です)
ぜひお気軽にご連絡ください。
Discussion