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
@@ -43,6 +43,8 @@ private protocol RemoteConfigNode {
|
||||
var gameVersion: String? { get }
|
||||
var gameZip: String? { get }
|
||||
var showmessage: String? { get }
|
||||
var audioDomain: String? { get }
|
||||
var audioBucket: String? { get }
|
||||
}
|
||||
|
||||
extension Agent: RemoteConfigNode {}
|
||||
@@ -85,6 +87,33 @@ public enum VersionResolver {
|
||||
)
|
||||
}
|
||||
|
||||
// MARK: - 音频运行参数(4 层 fallback + 顶层兜底)
|
||||
|
||||
/// 解析七牛 CDN 域名 / bucket 名。与版本字段同款 4 层 fallback:
|
||||
/// agent → game → channel → market 任一层都可声明 `audio_domain` / `audio_bucket`,
|
||||
/// 越深层赢;整链均未声明则 fallback 到 RemoteConfig 顶层 `audio_domain` / `audio_bucket`。
|
||||
///
|
||||
/// - Returns: `(domain, bucket)` —— 整链 + 顶层都未声明的字段返回 nil。
|
||||
public static func resolveAudio(
|
||||
config: RemoteConfig,
|
||||
agentId: String,
|
||||
channelId: String,
|
||||
marketId: String,
|
||||
gameId: String
|
||||
) -> (domain: String?, bucket: String?) {
|
||||
let chain = buildChain(
|
||||
config: config,
|
||||
agentId: agentId,
|
||||
gameId: gameId,
|
||||
channelId: channelId,
|
||||
marketId: marketId
|
||||
)
|
||||
return (
|
||||
domain: pickString(chain, \.audioDomain) ?? config.audioDomain,
|
||||
bucket: pickString(chain, \.audioBucket) ?? config.audioBucket
|
||||
)
|
||||
}
|
||||
|
||||
// MARK: - 节点链匹配
|
||||
|
||||
/// 沿 agent → game → channel → market 顺序逐层匹配,遇到不匹配的层立刻截断。
|
||||
|
||||
Reference in New Issue
Block a user