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 |
|