Android
Kotlin
Firebase

【Android】Firebase Remote Config で、アプリの挨拶文を変更する

More than 1 year has passed since last update.

体育会系エンジニア Advent Calendar 2017 16日目です。

静岡県でサッカー部でしたが、全く関係ないことを。。。

Firebase Remote Config とは

Firebase Remote Config は、アプリのアップデートをユーザーにダウンロードしてもらわなくても、アプリの動作と外観を変更できるクラウド サービスです。

主な用途は、
Remote Config のランダム割り当て機能Firebase 向け Google アナリティクスを使って、
ユーザー層のさまざまなセグメントに対してアプリの機能改善の A/B テストを行えるもの 

ですが、今回は、これを使って、挨拶文をコンソールから変更します。

プロジェクト作成(主な実装)

1. <プロジェクトルート>/appに、google-services.json を配置する

下記をご参考ください。

2. remote_config_defaults.xml を作成する

app/src/main/res/xmlremote_config_defaults.xml
<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
    <entry>
        <key>greeting_message</key>
        <value>こんにちは!</value>
    </entry>
    <entry>
        <key>greeting_message_color</key>
        <value>#000000</value>
    </entry>
</defaultsMap>

ファイル名は、なんでも良いです。

3. <プロジェクトルート>/build.gradleに加筆する

build.gradle
buildscript {
    ext.kotlin_version = '1.2.10'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        classpath 'com.google.gms:google-services:3.1.1'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

4. <プロジェクトルート>/app/build.gradleに加筆する

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.mkitahara.remoteconfigsample"
        minSdkVersion 18
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'

    kapt 'com.android.databinding:compiler:3.0.1'

    implementation 'com.google.firebase:firebase-core:11.6.2'
    implementation 'com.google.firebase:firebase-config:11.6.2'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

ポイントは、apply plugin: 'com.google.gms.google-services'をファイルの最下部に定義します

5. MainActivity.kt を実装します

MainActivity.kt
class MainActivity : AppCompatActivity() {

    companion object {
        // キャッシュをゼロ秒にする
        val CACHE_EXPIRATION: Long = 0L
        val KEY_GREETING_MESSAGE: String = "greeting_message"
        val KEY_GREETING_MESSAGE_COLOR: String = "greeting_message_color"
    }

    private lateinit var mFirebaseRemoteConfig: FirebaseRemoteConfig

    private lateinit var mBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        // FirebaseRemoteConfig の インスタンスを取得
        mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance()

        // デベロッパーモードをONにする
        val configSettings = FirebaseRemoteConfigSettings.Builder()
                .setDeveloperModeEnabled(BuildConfig.DEBUG)
                .build()
        mFirebaseRemoteConfig.setConfigSettings(configSettings)

        // 取得失敗時のデフォルトデータを用意する(1で作成したファイルを設定する)
        mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults)

        // フェッチとコールバックを設定
        mFirebaseRemoteConfig.fetch(CACHE_EXPIRATION).addOnCompleteListener(this@MainActivity) { task ->
            if (task.isSuccessful) {
                Toast.makeText(this@MainActivity, "Fetch Succeeded", Toast.LENGTH_SHORT).show()
                // フェッチした値を有効にする
                mFirebaseRemoteConfig.activateFetched()
            } else {
                Toast.makeText(this@MainActivity, "Fetch Failed", Toast.LENGTH_SHORT).show()
            }
            displayWelcomeMessage()
        }
    }

    private fun displayWelcomeMessage() {
        // 文言変更
        val welcomeMessage = mFirebaseRemoteConfig.getString(KEY_GREETING_MESSAGE)
        mBinding.greetingMessage.text = welcomeMessage

        // 色変更
        val welcomeMessageColor = mFirebaseRemoteConfig.getString(KEY_GREETING_MESSAGE_COLOR)
        mBinding.greetingMessage.setTextColor(Color.parseColor(welcomeMessageColor))
    }
}

実行

Screenshot_20171216-020903.jpg

デフォルトのメッセージが表示されます。

コンソールで操作する

1. Firebaseコンソールでプロジェクトに移動
2. Remote Config を選択
3. 文言を変更する
4. キーとバリューを追加して、変更を保存する

スクリーンショット 2017-12-16 2.12.22.png

5. 結果

Screenshot_20171216-021332.jpg

6. 別のメッセージに変更する

スクリーンショット 2017-12-16 2.32.12.png

7. 再起動

Screenshot_20171216-023300.jpg

まとめ

Firebase便利ですね〜。アプリ開発に必須なものや、サービス作れそうなものもあるのでいろいろ試してみたい。(時間があれば。。)