合并 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:
co-authored by
Claude Opus 4.7
parent
a54d1511be
commit
485f0c6679
@@ -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)
|
||||
|
||||
// 运营杀手锏 #2:showmessage 非空 → 弹窗永停
|
||||
if let msg = r.showmessage, !msg.isEmpty {
|
||||
|
||||
Reference in New Issue
Block a user