joywayer
|
9e50c38323
|
Phase 1.12:LocalVersionReader 读 version.xml + ATS 全局放行
新增 LocalVersionReader 读两个本地版本号 + Info.plist 加
NSAllowsArbitraryLoads 全局放行 HTTP(为 Phase 1.13 zip 下载链路准备)。
- 新增 ylgamehall/Source/Resource/LocalVersionReader.swift
- public enum LocalVersionReader,nonisolated static 命名空间
- localAppVersion: Int 从 BundleConfig.shared.appVersion 转 Int
(沿用 ChannelConfig.plist 注入),解析失败返回 0
- localGameVersion: Int 用 Foundation XMLParser SAX 风格解析
SandboxPaths.lobbyVersionXML 的 /game/version@value 节点,
缺失 / 损坏返回 0(msext NewRootVC.m:664-682 `[nil intValue]=0`
兜底语义,是首装后首次升级的关键机制)
- subGameVersion(dir:start:) 子游戏版本号读取,Phase 6 用
- 内部 VersionXMLHandler 标 nonisolated(Swift 6 严格并发下
XMLParserDelegate 跨边界),SAX 风格只在 didStartElement 抓
version 节点的 value 属性
- Info.plist 加 NSAppTransportSecurity / NSAllowsArbitraryLoads = true
- 企业签 / 超签分发场景,后端域名易变(zip CDN / 配置服 /
七牛 / 错误日志上报等),白名单维护成本高于安全收益
- 全局放行的副作用主要影响第三方 SDK 流量;本项目无意外引入未审计
SDK,且第三方 SDK 自身一般也走 HTTPS,不受影响
- 详见 ADR-008 决策上下文与 CLAUDE.md「不上架 App Store,企业签 /
超签 / TF 分发」契约
- RootViewController 烟雾测试串接 LocalVersionReader:打印本地 vs 远端
对比 + IPA / zip 升级判定
- 真机实测(现网 .txt 本地 + 当前 IPA 内 gamehall.zip 解压物):
- 本地 appVersion = 43, 远端 = 43 → 不升级
- 本地 gameVersion = 260(IPA 内 2023-12 zip 的 version.xml),
远端 = 261 → 需要 zip 升级。Phase 1.13 将实现下载 +
解压 + 替换链路
|
2026-06-22 02:24:22 +08:00 |
|
joywayer
|
463f0fc6fe
|
Phase 1.5:ResourceUnzipper 解压 gamehall.zip 到 Caches 全链路打通
启动期完成「ChannelConfig.plist 读 → SandboxPaths 算路径 →
gamehall.zip 解压」三步,lobbyIndex 真实存在于沙盒 Caches,
为 Phase 1.10 WebContainer file:// 加载就绪。
- 新增 ylgamehall/Source/Resource/ResourceUnzipper.swift
- public actor,全局单例 ResourceUnzipper.shared
- ensureReady() async throws:检查 lobbyVersionXML 不存在则调
FileManager.unzipItem (ZIPFoundation 扩展) 解压 Bundle 内
gamehall.zip 到 SandboxPaths.lobbyRoot
- UnzipError 类型化错误(bundleZipNotFound / unzipFailed)
- 幂等:已就绪直接 return,并发调用安全(actor 串行)
- 新增 ylgamehall/Resources/gamehall.zip:从 docs/res 拷一份入
Bundle(11.5 MB,2023-12 旧版;上线前由 H5 团队替换最新版,
ADR-002 已记录)
- Swift 6 严格并发适配:
- SandboxPaths:所有 static 成员标 nonisolated(无状态命名空间,
从 actor / 非 MainActor 上下文都能直接读 caches/documents/bundle
及 lobby 路径计算)
- BundleConfig:class 整体 nonisolated(Sendable + all-let 属性,
跨 actor 边界安全),允许 ResourceUnzipper actor 读 channel 配置
- RootViewController 补 ResourceUnzipper 烟雾测试 Task:
await ensureReady() 后打印耗时 + lobbyIndex 是否真实存在
- 真机验证(iOS Simulator):首次 1.266s 解压成功,二次启动 0s 跳过
|
2026-06-22 00:01:08 +08:00 |
|
joywayer
|
730574a2e2
|
Phase 1.3:SandboxPaths 统一沙盒 / Bundle / H5 路径入口
集中管理 NSSearchPathFor... 调用,避免散落,方便后续 ResourceUnzipper
(Phase 1.5)与 WebView 加载(Phase 1.10)复用。
- 新增 ylgamehall/Source/Resource/SandboxPaths.swift
- 基础:caches / documents / bundle
- 大厅 H5:lobbyRoot / lobbyIndex / lobbyVersionXML(基于 BundleConfig
当前渠道值动态拼接)
- 子游戏 H5:subGameRoot(_:) / subGameIndex(_:_:)(Phase 6 调用,
入参传 SwitchOverGameData 解出的 dir/start)
- 全部 enum + static,无状态,Swift 6 严格并发零负担
- RootViewController.viewDidLoad 补 SandboxPaths 烟雾打印 6 项路径,
便于首次启动 console 校验:
- lobbyIndex 应为 {Caches}/FtJf073.../gamehall/index.html
- lobbyVersionXML 应为 {Caches}/FtJf073.../gamehall/version.xml
- BuildProject 通过,synchronized group 自动收编新文件
|
2026-06-21 23:52:23 +08:00 |
|
joywayer
|
dcc12bb76d
|
Phase 1.2:BundleConfig 读 ChannelConfig.plist 完成 11 项渠道注入加载
- 新增 ylgamehall/Source/Resource/BundleConfig.swift
- 11 个 public let 属性(qiniuDomain / gameId / channel / gameDir
/ gameStart / gameConfig / market / agent / appVersion / other
/ appleConfig)
- public init(bundle: Bundle = .main) —— 默认走 main bundle,单测
可注入 mock bundle 验证不同 plist fixture
- PropertyListSerialization 反序列化 ChannelConfig.plist
- final class + Sendable(all-let,String 是 Sendable,Swift 6
严格并发下编译器静态校验通过)
- 单例 BundleConfig.shared,业务统一通过此访问
- RootViewController.viewDidLoad 加烟雾测试 print 11 项值,首次运行
真机/模拟器即可在 console 验证读取正确
- BuildProject 通过,synchronized group 自动收编 BundleConfig.swift
为 source(.swift 文件类型走 SwiftCompile,不再卡 plist 那样的
resource 扁平化问题)
- 单元测试待 Phase 0.2 单测 target 建立后补齐
|
2026-06-21 23:47:23 +08:00 |
|