ADR-009 凭证集中化:AppSecrets.plist + 七牛运行参数走 RemoteConfig.audio_*(契约影响)
【数据流改造(三分制)】 - 微信 AppID 唯一源 = Info.plist CFBundleURLTypes (URLName=weixin first scheme) - 应用级凭证 唯一源 = AppSecrets.plist (wxAppSecret/qiniuAccessKey/qiniuSecretKey) - 七牛运行参数 唯一源 = RemoteConfig 顶层 audio_domain / audio_bucket(远端动态注入) 【契约影响】 - ChannelConfig.plist:11 key → 10 key,移除 qiniudomain(ADR-007 守护规则同步) - BundleConfig:删除 qiniuDomain 属性 - RemoteConfig:顶层新增可选字段 audioDomain / audioBucket(JSON snake_case 自动归一化) - 启动期:WebContainerViewController parsed 分支校验 audio_domain/audio_bucket 非空, 缺失抛 BootError.audioConfigMissing 弹 modal 永停(与 showmessage 同等致命) - 上线前置:测试 / 生产远端 .txt 配置必须先补 audio_domain / audio_bucket 两个顶层 key - WeChatSDK.appID / WeChatAuth.appSecret / QiniuConfig.* 调用方零签名变化 【新增】 - ylgamehall/Resources/AppSecrets.plist(3 key) - ylgamehall/Source/Resource/AppSecrets.swift(单例加载,对齐 BundleConfig 模式) - QiniuConfig 改 actor:cdnDomain/bucketName 进 actor 状态 + update(...) async; accessKey/secretKey 仍 nonisolated(直接读 AppSecrets) - QiniuTokenSigner.uploadToken() 改 async(bucketName 来自 actor) - QiniuUploader 预取 cdnDomain 闭包外,SDK 同步 callback 内直接拼 URL 【删除】 - WeChatSDK.swift static let appID 硬编码 → Info.plist 启动期解析 - WeChatAuth.swift static let appSecret 硬编码 → AppSecrets.shared.wxAppSecret - QiniuConfig 中 accessKey / secretKey / bucketName / cdnDomain 四处硬编码 - ChannelConfig.plist 的 qiniudomain 字段(plist 与代码双源僵尸字段) 【文档同步】 - Plan:新增 ADR-009 + ADR-007 守护规则改 10 key + §236 BundleConfig 描述 - Design §3.4 多处 "11 项" → "10 项";§7.0.3 plist 示例 + BundleConfig 代码骨架 + Scripts/inject_channel.sh 同步 - SDK-Integration-Guide §0 凭证位置改三分制 + §尾"七牛域名读取"加新外壳路径 - Verification-Checklist L69 "(11 项)" → "(10 项)" 参考契约章节:docs/Development-Plan.md ADR-009、docs/H5-Native-Implementation-Design.md §7.0.3 BuildProject 通过,Xcode 即时诊断 0 警告。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
8125dd4d11
commit
83d9502dee
@@ -41,6 +41,8 @@ public final class WebContainerViewController: UIViewController {
|
||||
case operationalMessage(String)
|
||||
/// IPA 需要升级,弹窗 + Safari 外链
|
||||
case ipaUpgradeRequired(downloadURL: String)
|
||||
/// 远端 RemoteConfig 缺 audio_domain / audio_bucket:后台配置错误,启动期致命
|
||||
case audioConfigMissing
|
||||
}
|
||||
|
||||
// MARK: - Lifecycle
|
||||
@@ -183,6 +185,10 @@ public final class WebContainerViewController: UIViewController {
|
||||
} catch BootError.ipaUpgradeRequired(let dl) {
|
||||
// IPA 升级 modal alert(业务流程信号)
|
||||
showIPAUpgradeAlert(downloadURL: dl)
|
||||
} catch BootError.audioConfigMissing {
|
||||
// 后台配置错误:远端 RemoteConfig 缺 audio_domain / audio_bucket。
|
||||
// 用户/运营无法自助处理,与运营公告同款 modal 永停。
|
||||
showBlockingAlert(message: "音频服务暂不可用(配置缺失),请联系客服。")
|
||||
} catch {
|
||||
// 网络 / 权限拒 / 本地资源等可重试错误 → 在 splash 上展示错误态。
|
||||
// 异步 snapshot NWPath 区分"真断网"和"权限被拒",文案和按钮语义按 kind 精确分流。
|
||||
@@ -339,6 +345,15 @@ 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
|
||||
else {
|
||||
throw BootError.audioConfigMissing
|
||||
}
|
||||
await QiniuConfig.shared.update(cdnDomain: audioDomain, bucketName: audioBucket)
|
||||
|
||||
let bc = BundleConfig.shared
|
||||
let r = VersionResolver.resolve(
|
||||
config: cfg,
|
||||
|
||||
Reference in New Issue
Block a user