Commit Graph
5 Commits
Author SHA1 Message Date
joywayerandClaude Opus 4.7 13cc24b463 §7.5 路径回退到 writeToFile:撤销 evaluateJavaScript 路径
CLAUDE.md 原则 A 升级为第一准则(H5 端零修改不可妥协)后,重新评估
上一轮 commit 246f215 引入的 evaluateJavaScript 路径:

  - WKUserScript(.atDocumentStart) 注入会被 H5 自带 var app_xxx 声明
    覆盖回退
  - WKUserScript(.atDocumentEnd) 又太晚,H5 业务顶层 <script> 已经
    读过默认值
  - 没有"在 <script src> 之后、业务 <script> 之前"的精确时机
  - 任何"让 H5 改一行 / 改一个文件"的妥协方案违反原则 A 第一准则
  - 详细分析见 CLAUDE.md「典型案例 3」

撤销方案:回到原 msext writeToFile 路径,原生在 loadFileURL 之前写
4 个 app_*.js 文件到沙盒,H5 启动时 <script src> 同步引入即可读到
实际值,时序 100% 等价 msext。

Design §7.5 全面回退(-285 / +126 行):
  - §7.5 头部:标题 / 简介改回写文件路径;中间走过两次弯路的完整决策
    链记录在头部(commit f68b0db246f215 → 本次 commit)
  - §7.5.2 注入时机表 → 4 个文件写入时机表,附"为什么不要照搬
    WKUserScript 注入"警告段
  - §7.5.3 删除 AppDataInjector + .legacy 标注;AppDataWriter 升回主路径
    (保留 logger debug 输出 / msext 字面对齐细节 / 转义 / 大小写)
  - §7.5.4 接入点:writeInitial + writeBattery + writeNetwork 三阶段,
    addObserver 持续监听
  - §7.5.5 大厅 / 子游戏 / 弹层差异表回到 "app_data.js / app_gamesname.js
    / app_battery.js / app_network.js" 维度
  - §7.5.6 与 msext 差异表回到"writeToFile 等价化"对比
  - §7.5.7 与 §3.4.1 polyfill 关系:§7.5 文件预写为主路径;
    WKUserScript + evaluateJavaScript "探索后撤回"
  - §7.5.8 联调路径恢复 cat 文件路径,加 4 种现象诊断表

Contract §4.2 同步:
  - 头部说明改回 "原生 writeToFile 写文件" + 撤销中间 evaluateJavaScript
    路径的复盘段
  - 子节标题回到 "写到 {gamedir}/{gamestart}/app_*.js"
  - 子节"更新时机"段回到 loadFileURL 前 / addObserver / 前台切换
  - 删除"H5 团队 zip 自带 + 默认占位"约定(不再适用,原生重新负责写入)
  - 修订记录新增一行"路径再次调整(最终)"

Contract §10 验收清单同步:
  - "H5 zip 自带 4 个 .js" → "沙盒下 4 个 .js 存在(xcrun simctl + cat 验证)"
  - 删"原生 WKUserScript 覆盖生效"项 → 加"值是实际渠道值而非占位"
  - "阶段 B 动态覆盖" → "battery/network 变化重写文件"

Plan §6.4 里程碑加两行:CLAUDE.md A 升级 + §7.5 最终回退。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 12:40:07 +08:00
joywayerandClaude Opus 4.7 246f215d6f §7.5 重大路径调整:app_* 改为 evaluateJavaScript 覆盖 window.app_xxx
H5 团队新约定:app_*.js 4 个文件由 H5 团队自带在 gamehall.zip 内(含
默认占位值),原生**不再写文件**,只用 WKUserScript(.atDocumentEnd) +
evaluateJavaScript 覆盖 window.app_xxx 全局变量的实际值。

Design 三处大改 (+339/-91 净 +248 行):

§7.5 标题 / 头部:
  - 标题:H5 app_*.js 预注入文件机制 → 修改 H5 端 app_*.js 全局变量值
    (evaluateJavaScript 路径)
  - 新增「2026-06-22 重大方向调整」说明段:3 条理由 + 旧路径降级为
    §7.5.3.legacy

§7.5.2 注入时机:
  - 旧:4 个文件写入时机表
  - 新:两阶段注入表(A 首次 documentEnd UserScript / B 动态
    evaluateJavaScript)+ 为什么必须 documentEnd 不能 documentStart
    (H5 的 var 声明会回退我们的值)+ 为什么不直接走异步 callHandler
    (违反契约原则 A)

§7.5.3 Swift 骨架:
  - AppDataWriter (writeToFile) → AppDataInjector (UserScript +
    evaluateJavaScript)
  - 阶段 A makeInitialUserScript:拼装 (function(){window.app_xxx=...})()
    documentEnd 注入;包含 13 项启动期已知字段
  - 阶段 B injectBattery / injectNetwork:async evaluateJavaScript 单条覆盖
  - Logger.debug 保留所有 key=value 打印(联调可观察性)
  - 旧 AppDataWriter 保留为 §7.5.3.legacy(明示不要实施)

§7.5.4 接入点:
  - configuration.userContentController.addUserScript(阶段 A)
  - addObserver(batteryLevelDidChange) → injectBattery
  - networkMonitor.stateDidChange → injectNetwork
  - bridgedWebView.didFinishOnce 首次补一次 battery + network

§7.5.5 / .6 / .7 / .8 同步调整:差异表 / msext 对比 / 联调路径
  - §7.5.8 路径 2 从「沙盒 cat .js 文件」改为「Safari Web Inspector 看
    window.app_xxx 实时值」(不再写文件无文件可 cat)
  - 加阶段 B 手动触发验证(模拟器 Battery State / Network Link Conditioner)

Contract §4.2 同步:
  - 新增 msext 旧契约 vs 新契约对比表(3 维度:文件来源 / 赋值机制 / 路径感知)
  - 子节标题从「app_battery.js(写到 ...)」改为「H5 zip 包内,含
    app_getbattery 默认占位」+ 更新时机改写为 evaluateJavaScript 时机
  - 「H5 团队保证 zip 内 4 个 app_*.js 存在 + 合理默认占位」约定
  - 修订记录加一行路径调整

Contract §10 验收清单调整:
  - 文件验收:4 个 .js 由 H5 zip 自带(不是原生生成)
  - 新增「原生覆盖生效」验收:Web Inspector 读 window.app_channel 必须
    是 ChannelConfig.plist 实际值,不是 H5 默认占位
  - app_Launchtype 类型修正为数字 0/1(不是字符串)
  - 新增「阶段 B 动态覆盖」验收:模拟器手动触发 battery/network 变化

Plan §6.4 里程碑加新一行记录本次路径调整。

至此 H5↔Native 通讯 5 条路径全部按新契约对齐:
  1. WVJB 异步 callback(22 项)
  2. Native→H5 反向 callback(15 项)
  3. **window.app_xxx evaluateJavaScript 覆盖(15 项)** ← 本次重写
  4. 弹层 settings.* polyfill(4 项)
  5. WKUIDelegate alert/confirm(2 项)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 08:19:53 +08:00
joywayerandClaude Opus 4.7 0cdd709e66 中优 3 项收尾:Plan §6.4 里程碑 + Design §20.1 拆分 + Contract §10 验收清单
补完本轮 audit 与 Design 大改后的文档边界,避免后续 Phase 实施者
按陈旧描述走弯路。

1. Plan §6.4 文档同步段新增「Design 接口骨架覆盖里程碑」表:
   - 4 行时间线记录 Phase 1 闭环 / Design 全 51 项接口骨架 / Contract §4.2
     按 daoqi 原项目修订 / CLAUDE.md 加典型案例的 commit hash
   - 末尾澄清「§3.4.1 撤销说明」与 §7.5 主路径关系,避免新人疑惑

2. Design §20.1 LobbyHandlers 加架构说明段:
   - 明示实际拆为 AudioHandlers / DeviceHandlers / LocationHandlers /
     ShakeHandlers / OpenurlTitleDataHandler 5 个 sub-struct(§8.1.1 /
     §8.4.1 / §8.6 / §8.7 / §3.4.2 各自归属)
   - LobbyHandlers 成为聚合点,依次调子 .register()
   - 保留 monolithic register 速查表作为与 Contract §3.1 编号对账用
   - 每行注释 §3.1 [N] 编号便于追溯

3. Contract §10 验收清单加 5 项硬约束:
   §A 启动新增:
     - app_*.js 4 个文件存在
     - 15 个 app_* 全局变量命名 100% 正确(大小写硬约束)
     - 大厅 vs 子游戏 app_Launchtype = "0"/"1" 字面差异
     - app_gameid / app_compareCode 必须 undefined(早期 Contract 误列)
   §B 桥接新增:
     - H5 alert(msg) → UIAlertController 单按钮
     - H5 confirm(msg) → 取消/确定 双按钮 + 正确返回 bool

至此 Plan / Design / Contract 三文档完全对齐 51 项接口(含 §7.5 app_*.js
15 个、§3.7 WKUIDelegate 2 个)。Phase 2 实施可直接对照 Contract §10
验收清单做契约测试。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 08:02:24 +08:00
joywayerandClaude Opus 4.7 47a89aa49c Contract §4.2:按原项目代码全面修订 app_*.js JS 注入清单
Phase 1.17 联调准备时回归原项目(CLAUDE.md「先看原项目」规则),
grep daoqi/msext 全部 "var app_" 字面字符串,对照本文档 §4.2 早期记录
发现 4 类硬错误:

1. 多列了不存在的变量 — 原项目代码字面字符串里**根本不写**:
   - app_gameid    grep 0 命中  → 删除
   - app_compareCode grep 0 命中 → 删除

2. 文件名与变量名混淆 — msext 文件名不带 get、变量名带 get:
   - 文件 app_battery.js → 内容 "var app_getbattery=%lf;"  (gameController.m:1191 / NewRootVC.m:1706)
   - 文件 app_network.js → 内容 "var app_getnetwork=%d;"   (gameController.m:1198 / NewRootVC.m:1714)
   早期文档统一写成 app_battery / app_network 容易让实施者把变量名也
   去掉 get,导致 H5 业务读到 undefined → 修正

3. 漏列 6 项真实存在的变量(gameController.m:2160 / NewRootVC.m:1204
   / AppDelegate.m:259 字面字符串里都有):
   - app_version           硬编码 "1"
   - app_Launchtype        大厅 0 / 子游戏 1(⚠️ L 大写)
   - app_getwifisignalLevel 硬编码 1(⚠️ wifi 小写、signal/Level 大小写区分)
   - app_gamename          大厅 = gameStart / 子游戏 = game_name
   - app_invitationcode    tuiguang_id 推广码 / 邀请码
   - app_gamesname         独立 app_gamesname.js 文件 (var<两空格>new Array)

4. 大厅 vs 子游戏字面差异之前未注明:
   - app_Launchtype = 0/1
   - app_gamedir:gamedir vs gamefilepath
   - app_gamestart + app_gamename:gamestart vs game_name

新增"修订记录"小节明示三处修订的代码依据行号,方便未来回溯。

至此 Contract §4.2 与 Design §7.5 完全对齐(15 项变量,全部对应到
daoqi 原项目真实代码行)。Phase 2 实施 AppDataWriter 时按 Contract §4.2
为准,H5 端验收按 Contract 不会再有差异。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 07:58:02 +08:00
joywayer beb05ab451 添加文档和CLAUDE.md 2026-06-21 19:39:22 +08:00