Firebaseとは
- Googleが買収したサービス
- 詳細はググろう
AndroidでRemote Configを使うにあたって、少しだけハマりどころがあったのでその共有。
Remote Configとは
- Firebaseのコンソール側でKey:Valueの値を登録しておける
- 基本的に全ユーザーに対して同じKey-Valueをリアルタイムに配信・反映できる
- 条件(アプリバージョン、OS、指定%のユーザー等)を指定してValueを変える事もできる
- A/Bテストとか、使いみちはいろいろ。
Androidで使う準備
- コンソールにアクセスしてプロジェクトを作成する
- コンソールからアプリのpackage名とkeystoreを登録する
- このとき、一度登録してしまうと削除する手段がない(なさそう)ので「どのプロジェクト」に「なんのアプリ」を登録するかは慎重に決める
- ただし、keystoreを変えてしまえば別アプリとして認識されるので、配信前であればなんとかなる
- コンソールからConfig値を指定する
- Androidプロジェクトにライブラリを登録する
- この時、pluginとの兼ね合いで"9.+"のように曖昧な設定はできず、"9.0.2"のようにバージョンを確定させる
// 追加例
dependencies {
compile "com.google.firebase:firebase-config:9.0.2"
}
実際に使う
- デフォルト値をFirebaseに教える
- XMLを使って指定する、もしくはMapクラスを使ってデータを直接指定する方法が使える
- サンプルはXMLを使っているが、上記どちらでも良いが、失敗した場合の挙動が異なる
// インスタンスを取得する
final FirebaseRemoteConfig mRemoteConfig = FirebaseRemoteConfig.getInstance();
// Mapで直接デフォルト値を差し込む
Map<String, Object> defValues = new HashMap<>();
defValues.put("key", "value");
mRemoteConfig.setDefaults(defValues);
// 読み込む
mRemoteConfig.getString("key");
注意点
- デフォルトに空文字("")を指定することはできない
- 指定した場合、正常にFirebaseのvalueを同期することができなくなる
- XMLで空文字を指定した場合、setDefaults()で例外が投げられる
- 仕方ないので、クソ文字として
"nil"
を指定した
- 同期は明示的に行う必要がある
- Firebaseのコンソールから値を変更した場合、「すぐに反映されます」と脅されるが、実際にアプリに反映するにはプログラム側で同期処理を行う必要がある
- 逆に、それを行わないかぎりは古い値(もしくはデフォルト値)を使い続ける
- 意図しないタイミングでの反映を避けるための挙動と考えられる
- 同期は1時間ごとに回数制限があり、それを超えたい場合はFirebaseをdeveloper modeにする必要がある
- 値は
fetch()
で取得 ->activateFetched()
で反映させる- 「fetchだけして値はactivateしない」という処理も可能
- activateするまでは古い値が有効となる
- デフォルトに空文字等の無効な値が入っていると、activateが必ず失敗する(9.0.2での挙動)
- fetchそのものは一瞬で終わる(体感)
// cacheExpireSecには、キャッシュの有効秒数を指定しておく
// 3600秒=1時間に設定して、アプリ起動時にチェックするといいんじゃないかな?
Task<Void> fetch = mRemoteConfig.fetch(cacheExpireSec);
// fetchを待つ...
// fetchが成功したら、反映させる
if (fetch.isSuccessful()) {
// 明示的にactivateする
mRemoteConfig.activateFetched();
}
// Developer Modeに切り替える
mRemoteConfig.setConfigSettings(
new FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(true).build()
);