Commit Graph
5 Commits
Author SHA1 Message Date
joywayer af1a2028e5 Phase 1.8:WebViewJavascriptBridge.js 协议源码入 Bundle
H5 端桥协议实现,与 BridgeBus 的消息格式 1:1 对齐:
H5 → Native 走 window.webkit.messageHandlers.WVJBHandler.postMessage(...),
Native → H5 走 window.WebViewJavascriptBridge._handleMessageFromObjC(base64)。

- 新增 ylgamehall/Resources/JS/WebViewJavascriptBridge.js(~130 行)
  - bridge.registerHandler(name, fn):H5 注册等待 Native callHandler
  - bridge.callHandler(name, data, responseCallback):H5 主动调 Native
  - bridge._handleMessageFromObjC(b64):Native 入口,base64 → JSON parse
    → 派发到 H5 handler 或匹配响应 responseCallbacks
  - base64 解码用 decodeURIComponent + atob 处理 UTF-8 多字节字符
  - 兼容 marcuswestin 旧式 window.WVJBCallbacks 队列握手:注入后
    立即 flush 队列(H5 业务代码无需修改)
- RootViewController 加 Phase 1.8 烟雾测试:Bundle.main.url 找到 JS 文件
  并打印 bytes / head;synchronized group 会把 Resources/JS/ 子目录
  扁平化到 bundle 根,注释里说明此约束
- BuildProject 通过,bundle/WebViewJavascriptBridge.js 实际存在
- 下一步 Phase 1.9 BridgedWebView 用 WKUserScript(.atDocumentStart) 注入
  本文件到所有 H5 页面,桥真正生效
2026-06-22 00:16:55 +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 b866ee212c Phase 1.4:引入 ZIPFoundation SPM 依赖(v0.9.20)
ResourceUnzipper(Phase 1.5)的前置:用 ZIPFoundation 替代旧 ZipArchive
解压 gamehall.zip。ADR-006 纯 SPM + Vendor 策略下的首个 SPM 依赖。

- 引入:https://github.com/weichsel/ZIPFoundation
  - 版本 0.9.20(Up to Next Major,commit 22787ffb59de)
  - License: MIT;纯 Swift 实现,Xcode 26 原生兼容
  - 链接到 target ylgamehall
- pbxproj:XCRemoteSwiftPackageReference + XCSwiftPackageProductDependency
  写入;Package.resolved 锁定版本,多机 / CI 复现
- BuildProject 通过;ZIPFoundation 全部 .swift 由 SwiftCompile 实际
  参与构建,与 ylgamehall target 链接完成
- 附带:ChannelConfig.plist 移除内联说明注释(Phase 1.1 commit 后由
  维护者整理),不影响 plist 数据结构
2026-06-21 23:56:32 +08:00
joywayer c25a7514c7 fix(ChannelConfig.plist):注释去掉 -- 双连字符避免 XML parse 错误
XML 注释规范禁止 -- 出现在注释内,原注释包含的 codesign 命令示例
(--force / --sign / --entitlements)触发解析错误,Xcode 直接打开
plist 报 "XML Parse Error: Comment must not contain '--'"。

把详细命令示例移除,只保留单行简短指引,命令示例已在 Design
§7.0.3 写过,不在 plist 重复。
2026-06-21 23:45:38 +08:00
joywayer 8c2ffa3106 Phase 1.1:渠道注入用 ChannelConfig.plist 替代 msext 目录树(ADR-007)
契约 §0.3 描述 msext 把 11 个渠道值编码为 Bundle 根的 11 个空目录
子文件夹名(目录名本身就是值)。在 Xcode 26.5 默认的 synchronized
group 下,此机制不兼容(子目录被扁平化、11 个 .gitkeep 撞名;
folder reference 拖入流程失效;Run Script Phase 受 sandbox 阻碍且
默认 Based on dependency analysis 让 clean build 也不跑)。

CLAUDE.md 原则 B 落地——原生内部自由重构,不照搬 msext。改用单一
plist 存储等价语义,H5 端通过 app_data.js 看到的 11 个 JS 全局变量
行为完全不变(契约边界在 BundleConfig.shared.xxx,与底层无关)。
多渠道分发用 plutil -replace + 重签 + 重打包,工作量与 mv 目录名
重签完全相同。

- 新增 ylgamehall/Resources/ChannelConfig.plist:11 个 string key
  含母包默认值(沿用 msext 现网值);synchronized group 自动入 Bundle
- Design §7.0 / §7.2 重写为 plist 方案;BundleConfig 代码骨架改为
  PropertyListSerialization + init(bundle:) 可注入式
- Plan §5 Phase 1.1 任务清单从 4 个子项简化为 1 项;ADR-004 文字
  同步;新增 ADR-007 完整记录决策背景 / 触发事件 / 工程兼容性分析
  / 理由 / 守护条款
- pbxproj:ENABLE_USER_SCRIPT_SANDBOXING 残留为 NO(前期 Run Script
  方案探索时关闭,plist 方案下不再需要,但未恢复以避免再次 UI 操作;
  无 Run Script 故无实际安全暴露面,未来可随时改回 YES)
- BuildProject 验证:plist 已落在 .app 根,plutil -p 输出 11 个键值
  完整
2026-06-21 23:41:25 +08:00