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"
}
}
}
缓存场景
在缓存机制中,我们维护两个值,requestOrigin
和 status
,它们可用于了解缓存场景。
它们可以从 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 | 是 | 是 | 是 | 远程 | 成功 |