# RCR - キャッシュメカニズム

> Understand caching for Remote Config Runtime.

Remote Config Runtime はキャッシュメカニズムを使用します。これは以下のように機能します。

* RCR は最後に保存された設定をディスク上のキャッシュファイルから読み取ります。成功した場合は、その設定が適用されます。
* アプリケーションの接続が初めてで、キャッシュファイルがない場合、RCR は各変数型に初期値を適用します (int は 0、string は "" など)。
* RCR がリクエストを行います。成功した場合は、前に適用されたキャッシュされている設定をオーバーライドします。
* 最後に受け取った設定により、キャッシュファイル内の値もオーバーライドされます。
* このメカニズムは、コンソール以外のすべてのプラットフォームに適用されます。これは、コンソールでのディスクへの書き込みには特別なプラットフォーム権限が必要であるためです。

## キャッシュファイルの場所##cache-file-location

キャッシュファイルの場所は、`Application.persistentDataPath/{YourApp}/RemoteConfigCache.json` です。これは、[persistentDataPath のドキュメント](https://docs.unity3d.com/ScriptReference/Application-persistentDataPath.html) に記載されているように、プラットフォームによって異なります。

例えば、Mac の場合、キャッシュファイルは **/Users/YourName/Library/Application Support/DefaultCompany/\{YourApp}/RemoteConfigCache.json** にあります。

サンプルキャッシュファイルの内容:

```json
{
    "settings": {
        "requestOrigin": 2,
        "status": 2,
        "body": {
            "configs": {
                "settings": {
                    "rotateY": 30.0,
                    "rotSpeed": 44.0,
                    "swordName": "Singing Sword",
                    "rotateZ": 4.0,
                    "jsonCubeCustom": {
                        "rotateX": 20,
                        "color": {
                            "r": 0.2,
                            "g": 0.2,
                            "b": 0.3,
                            "a": 1
                        }
                    },
                    "swordPrice": 5,
                    "testdateString": "2021-10-21T10:00:00.0000001-07:00",
                    "rotateX": 777.0
                }
            },
            "metadata": {
                "assignmentId": "355faf1d-9ce0-4528-9267-95ffe07ed891",
                "environmentId": "11daa94d-0ffa-41e2-8579-f4acbbdb3987",
                "bundle": "657abf6ee46c9dc227581a7adba48bca89dfb620"
            }
        },
        "headers": {
            "Date": "Mon, 15 Nov 2021 17:44:08 GMT",
            "Content-Type": "application/json;charset=utf-8",
            "Access-Control-Allow-Origin": "\*",
            "Content-Length": "429",
            "Server": "Jetty(9.4.z-SNAPSHOT)",
            "Via": "1.1 google",
            "Alt-Svc": "clear",
            "Connection": "keep-alive"
        }
    }
}
```

## キャッシュのシナリオ##caching-scenarios

キャッシュメカニズム内では、`requestOrigin` と `status` という 2 つの値が保持されます。これらを使用して、キャッシュシナリオを理解できます。

これらの値は、`configResponse` 変数からアクセスできます。例えば、以下はコールバック内で requestOrigin を利用する方法を示しています。

```c#
void ApplyRemoteSettings (ConfigResponse configResponse) {
        // Conditionally update settings, depending on the response's origin:
        switch (configResponse.requestOrigin) {
            case ConfigOrigin.Default:
                Debug.Log ("No settings loaded this session; using default values.");
                break;
            case ConfigOrigin.Cached:
                Debug.Log ("No settings loaded this session; using cached values from a previous session.");
                break;
            case ConfigOrigin.Remote:
                Debug.Log ("New settings loaded this session; update values accordingly.");
                break;
        }
    }
```

requestOrigin の可能な値: `{0:Default, 1:Cached, 2:Remote}`

status の可能な値: `{0:None, 1:Failed, 2:Success, 3:Pending}`

これらの値に基づき、以下のキャッシュシナリオを特定できます。

1. ユーザーがこれまで接続したことがなく、現在も接続がない場合には、初期値が適用されます。
2. ユーザーがこれまで接続したことがなく、現在接続がある場合、リモート値が適用され、ローカルディスク上のキャッシュに書き込まれます。
3. ユーザーが過去に少なくとも 1 回は接続しており、現在接続がない場合、キャッシュされている値が適用されます。
4. ユーザーが過去に少なくとも 1 回は接続しており、現在接続がある場合、リモート値が適用され、キャッシュされている値が上書きされます。

これらのシナリオをまとめると以下の表のようになります。

| シナリオ | これまでの接続 | 現在の接続 | キャッシュファイル | requestOrigin | status  |
| ---- | ------- | ----- | --------- | ------------- | ------- |
| 1    | なし      | なし    | なし        | Default       | Failed  |
| 2    | なし      | あり    | あり        | Remote        | Success |
| 3    | あり      | なし    | あり        | Cached        | Failed  |
| 4    | あり      | あり    | あり        | Remote        | Success |
