RCR - 缓存机制

远程配置运行时使用缓存机制,其工作原理如下

  • RCR 从磁盘上的缓存文件中读取上次保存的配置,如果成功,则应用该配置
  • 如果应用首次连接并且没有缓存文件,RCR 将为每个变量类型应用默认值(整数为 0,字符串为 "",等等...)。
  • RCR 发出请求,如果成功,它将覆盖之前应用的缓存配置
  • 最后收到的配置也会覆盖缓存文件中的值
  • 此机制适用于除主机以外的所有平台,因为主机上的磁盘写入需要特殊的平台权限

缓存文件位置

缓存文件的位置在 Application.persistentDataPath/{YourApp}/RemoteConfigCache.json 中,它因平台而异,如 persistentDataPath 文档 中所示

例如,在 Mac 上,缓存文件可以在以下位置找到:/Users/YourName/Library/Application Support/DefaultCompany/{YourApp}/RemoteConfigCache.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"
        }
    }
}

缓存场景

在缓存机制中,我们维护两个值,requestOriginstatus,它们可用于了解缓存场景。

它们可以从 configResponse 变量中访问,例如,以下是如何在回调中使用 requestOrigin 的方法

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. 如果用户至少连接过一次,而现在没有连接,则应应用缓存的值
  4. 如果用户至少连接过一次,而现在已连接,则应应用远程值,因为它们会覆盖缓存的值

这些场景应适合下表

场景以前连接过有连接缓存文件来源状态
1默认失败
2远程成功
3缓存失败
4远程成功