audio_domain/audio_bucket 改 4 层 fallback + 顶层兜底,修"音频服务不可用"误报

【bug】
ADR-009 初版只从 RemoteConfig 顶层读 audio_domain / audio_bucket,但渠道方
配置时习惯把这俩字段放在 agent 节点(与 app_version / game_zip 等版本字段同
款层级),导致客户端读到空值后误报 BootError.audioConfigMissing 启动期致命。

【方案】
对齐版本字段的 4 层 fallback 算法:
- Agent / Game / Channel / Market 4 个节点 struct 各加 audioDomain / audioBucket
- RemoteConfigNode 协议加这俩 getter
- VersionResolver 新增 resolveAudio(...) → (domain:String?, bucket:String?)
  逻辑:agent → game → channel → market 倒序找第一个非空,整链空时 fallback 顶层
- WebContainerViewController parsed 分支改用 resolveAudio + print 诊断日志

【兼容性】
顶层 audio_domain / audio_bucket 仍然支持(作为整链兜底),后台不需要改配置
位置;放节点上也能读到——任意一种 layout 都工作。

【文档】
Plan ADR-009 决策表 + 注入时序段 同步更新 + 加 2026-06-27 修订说明记录此次踩坑。

BuildProject 通过,Xcode 诊断 clean。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-27 21:30:10 +08:00
co-authored by Claude Opus 4.7
parent 6742308e14
commit a54d1511be
4 changed files with 71 additions and 10 deletions
@@ -345,16 +345,26 @@ public final class WebContainerViewController: UIViewController {
throw BootError.operationalMessage(msg)
case .parsed(let cfg):
// audio_domain / audio_bucket
// 使
guard let audioDomain = cfg.audioDomain, !audioDomain.isEmpty,
let audioBucket = cfg.audioBucket, !audioBucket.isEmpty
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)
let bc = BundleConfig.shared
let r = VersionResolver.resolve(
config: cfg,
agentId: bc.agent,