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:
co-authored by
Claude Opus 4.7
parent
6742308e14
commit
a54d1511be
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user