Remote Configurationの使い方

# Remote Configurationとは
パラメータをリモート（サーバー）に持たせることで、リモート側の変更のみで、新しいアプリをリリースせずに、アプリの見た目や動作を変更します。

# Remote Configurationの使い方

## 前準備
(1) Huaweu Developerを登録します。

(2) AppGallery Connectでアプリのプロジェクトを登録します。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/7ad86f57-75ef-2aa1-7f8a-89ba53ec0ae1.png">
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/910d9b63-0bf4-90fd-3aba-168b4eb26310.png">
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/890cd9ee-09ad-3e72-d9fb-7b1d95d48c45.png">
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/50d68b1d-4b5f-d185-2ecc-3b03c4175ad7.png">
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/25cf901a-7e9f-fbde-9eeb-63504bb9a821.png">

(3) keytoolで生成したSHA256をAppGallery Connectのアプリプロジェクトに登録します。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/60cc348f-e029-8b02-8291-b16df40dd33d.png">

(4) agconnect-services.jsonをダウンロードし、appフォルダに配置します。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/f50eb1bb-6cbd-4575-0cb3-8f40b19c871d.png">
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/74e4218e-ea0d-fbbf-6cc3-134ff40d9c0f.png">

(5) "Remote Configuration"を開き、"Enable now"をクリックし、Remote Configurationを有効にします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/84954c8a-8f5a-5baf-0137-ac4bb9ad8677.png">

## HMS SDKを導入
(1) プロジェクトのbuild.gradleを開き、mavenとclasspathを追加します。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/7ee345a1-2c6d-9857-deed-776060a09de4.png">

```gradle:build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.3.72"
    repositories {
        google()
        jcenter()

        // こちらの行を追加
        maven {url 'http://developer.huawei.com/repo/'}
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.1"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

        // こちらの行を追加
        classpath 'com.huawei.agconnect:agcp:1.3.1.300'
    }
}

allprojects {
    repositories {
        google()
        jcenter()

        // こちらの行を追加
        maven { url 'http://developer.huawei.com/repo/' }
    }
}
```

(2) モジュールのbuild.gradleを開き、次のようにを追加します。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/7cd74ac6-a36a-dbdd-30ea-fb24c14f0408.png">

```gradle:build.gradle
plugins {
    id 'com.android.application'
    id 'kotlin-android'

    // こちらの行を追加
    id 'com.huawei.agconnect'
}

android {
    // signingConfigsを追加
    signingConfigs {
        debug {
            storePassword 'My password'
            keyAlias 'My keyAlias'
            keyPassword 'My password'
            storeFile file('My keystore file.jks')
            v1SigningEnabled true
            v2SigningEnabled true
        }
        release {
            storePassword 'My password'
            keyAlias 'My keyAlias'
            keyPassword 'My password'
            storeFile file('My keystore file.jks')
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

    buildTypes {
        release {
            // signingConfigを追加
            signingConfig signingConfigs.release

            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            // signingConfigを追加
            signingConfig signingConfigs.debug

            debuggable true
        }
    }

    buildFeatures {
        dataBinding true
    }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    // Remote Configurationのライブラリを追加
    implementation 'com.huawei.agconnect:agconnect-remoteconfig:1.6.1.300'
    // Analytics Kitのライブラリを追加
    implementation 'com.huawei.hms:hianalytics:6.3.0.303'
}
```

## コーディング
デフォルトのパラメータをXMLファイルに定義します。
パラメータの種類は主にboolean、double、long、stringがあります。

```xml:remote_config.xml
<remoteconfig>
    <value key="boolean">true</value>
    <value key="double">1234567890.12</value>
    <value key="long">123456789012</value>
    <value key="string">Text</value>
    ...
    <value key="key5">value5</value>
    <value key="key6">value6</value>
    <value key="key7">value7</value>
    <value key="key8">value8</value>
    <value key="key9">value9</value>
</remoteconfig>
```


```kotlin
// 更新頻度
private val FETCH_INTERVAL = 60 * 5L
// Remote Configurationのオブジェクト
private val config = AGConnectConfig.getInstance()

override fun onCreate(savedInstanceState: Bundle?) {
    ...

    // XMLに入れたデフォルト値をロードします。
    config.applyDefault(R.xml.remote_config)
}

// リモートからパラメータをダウンロードし、適用します
private fun fetch() {
    config.fetch(FETCH_INTERVAL).addOnSuccessListener {
        config.apply(it)
        applyConfigValue()
    }.addOnFailureListener {
        it.printStackTrace()
    }
}

// 前回リモートからダウンロードした値を適用します
private fun loadConfig() {
    config.apply(config.loadLastFetched())
    applyConfigValue()
}

// パラメータを適用します
private fun applyConfigValue() {
    viewModel.boolean.value = config.getValueAsBoolean("boolean")
    viewModel.double.value = config.getValueAsDouble("double")
    viewModel.long.value = config.getValueAsLong("long")
    viewModel.string.value = config.getValueAsString("string")
}
```

注意：更新頻度の制限は端末ごとに1時間に20回までです。

## リモート側の新パラメータの追加
(1) "Remote Configuration"に入り、"New parameter"をクリックします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/f58547cb-794f-2b74-eb5e-01f58f48e378.png">

(2) キーを"Parameter"に入れ、値を"Default value"に入れます。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/4e22f127-2f46-0de2-5dc3-e4bd44d75813.png">

## リモート側のパラメータの編集
対象パラメータの右上のメニューを開き、編集を行います。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/75eee8b2-afe5-2484-c018-d5fc32e5abfc.png">

# GitHub
[https://github.com/Rei2020GitHub/MyPublicProject/tree/master/RemoteConfigDemo](https://github.com/Rei2020GitHub/MyPublicProject/tree/master/RemoteConfigDemo)

# 参考
* HMS：[https://developer.huawei.com/consumer/jp/](https://developer.huawei.com/consumer/jp/)
* Remote Configurationの紹介：[https://developer.huawei.com/consumer/jp/agconnect/remote-configuration](https://developer.huawei.com/consumer/jp/agconnect/remote-configuration)
* Remote Configurationのドキュメント：[https://developer.huawei.com/consumer/jp/doc/development/AppGallery-connect-Guides/agc-remoteconfig-introduction-0000001055149778](https://developer.huawei.com/consumer/jp/doc/development/AppGallery-connect-Guides/agc-remoteconfig-introduction-0000001055149778)
* Huawei Developers：[https://forums.developer.huawei.com/forumPortal/en/home](https://forums.developer.huawei.com/forumPortal/en/home)
* Facebook Huawei Developersグループ：[https://www.facebook.com/Huaweidevs/](https://www.facebook.com/Huaweidevs/)