合并 resolveAudio 进 resolve():所有 RemoteConfig 字段走单一入口 + 同款 4 层 fallback

【动机】
上个 commit 把 audio_domain/audio_bucket 改成 4 层 fallback,但用了独立的
resolveAudio() 入口 —— 与 resolve() 并存意味着调用方要记两个 API,违反
"统一接口"原则。

【方案】
- ResolvedVersion 加 audioDomain / audioBucket 两个字段(扁平结构)
- resolve() 内直接 pickString(chain, \.audioDomain) ?? config.audioDomain 一次解出
- 删除 resolveAudio() 公开入口
- WebContainerViewController parsed 分支:单次 resolve() 调用 + 同一 r 取所有字段

【硬约束(Plan ADR-009 同步)】
远端 RemoteConfig 所有字段必须走 VersionResolver.resolve(...) 单一入口、
同一套 4 层 fallback;新增字段时加进协议 + 节点 struct + ResolvedVersion +
一行 pickString,不允许为某字段单独写 if 链或 helper。

BuildProject 通过。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-27 21:32:57 +08:00
co-authored by Claude Opus 4.7
parent a54d1511be
commit 485f0c6679
3 changed files with 27 additions and 50 deletions
@@ -347,24 +347,9 @@ public final class WebContainerViewController: UIViewController {
case .parsed(let cfg):
let bc = BundleConfig.shared
// audio_domain / audio_bucket 4 fallback
// agent game channel market RemoteConfig
// ,使
let audio = VersionResolver.resolveAudio(
config: cfg,
agentId: bc.agent,
channelId: bc.channel,
marketId: bc.market,
gameId: bc.gameId
)
print("[QiniuConfig] resolved audio domain=\(audio.domain ?? "<nil>") bucket=\(audio.bucket ?? "<nil>")")
guard let audioDomain = audio.domain, !audioDomain.isEmpty,
let audioBucket = audio.bucket, !audioBucket.isEmpty
else {
throw BootError.audioConfigMissing
}
await QiniuConfig.shared.update(cdnDomain: audioDomain, bucketName: audioBucket)
// 4 fallback + + showmessage
// VersionResolver.resolve(...) agent game channel market
// fallback RemoteConfig
let r = VersionResolver.resolve(
config: cfg,
agentId: bc.agent,
@@ -372,6 +357,16 @@ public final class WebContainerViewController: UIViewController {
marketId: bc.market,
gameId: bc.gameId
)
print("[VersionResolver] resolved appVer=\(r.appVersion) gameVer=\(r.gameVersion) audioDomain=\(r.audioDomain ?? "<nil>") audioBucket=\(r.audioBucket ?? "<nil>")")
// audio_domain / audio_bucket ,
// 使
guard let audioDomain = r.audioDomain, !audioDomain.isEmpty,
let audioBucket = r.audioBucket, !audioBucket.isEmpty
else {
throw BootError.audioConfigMissing
}
await QiniuConfig.shared.update(cdnDomain: audioDomain, bucketName: audioBucket)
// #2showmessage
if let msg = r.showmessage, !msg.isEmpty {