§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>
This commit is contained in:
joywayer
2026-06-22 08:19:53 +08:00
co-authored by Claude Opus 4.7
parent 9f4ccb762e
commit 246f215d6f
3 changed files with 309 additions and 92 deletions
+1
View File
@@ -766,6 +766,7 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin
| 2026-06-22 | Design 蓝图按 Contract 全 51 项接口补完实现骨架(H5↔Native 5 条通讯路径):22 项 §3.1 异步 handler / 15 项 §3.2 反向 callback / 3 项 §3.4 弹层 polyfill / 15 项 §7.5 `app_*.js` 预注入全局变量 / 2 项 §3.7 WKUIDelegate alert/confirm | `92298b6` / `c6221d3` / `d48ecc0` / `a06a18c` / `5f5f6a9` / `33574a1` / `f68b0db` |
| 2026-06-22 | Contract §4.2 按 daoqi 原项目代码(grep `var app_` 字面字符串)全面修订:删 `app_gameid` / `app_compareCode`(原项目不写)/ 修正 `app_battery``app_getbattery``app_network``app_getnetwork`(文件名不带 get、变量名带 get)/ 补 6 项遗漏(version / Launchtype / getwifisignalLevel / gamename / invitationcode / gamesname | `47a89aa` |
| 2026-06-22 | CLAUDE.md 新增第 2 个典型案例「H5 与原生通讯接口的真实路径」记录"凭语义猜测会一字之差犯错、必须 grep 字面字符串验证"的教训 | `fae7b3d` |
| 2026-06-22 | **§7.5 重大路径调整**:从「原生 `writeToFile` 写 4 个 `app_*.js` 文件」改为「H5 团队 zip 自带 + 原生 `WKUserScript(.atDocumentEnd)` / `evaluateJavaScript` 覆盖 `window.app_xxx` 全局变量」。Design §7.5 全面重写(`AppDataWriter``AppDataInjector`),Contract §4.2 同步新契约,§10 验收清单调整 | 本次 commit |
> **§3.4.1 撤销说明**:早期 commit `82bad8a` 实现的 `window.settings.getXxx()` polyfill 已撤销 — Contract §附录 A 自身明示「iOS<9 路径,新外壳如最低系统 ≥ iOS 14 可不实现」,本项目最低 iOS 15.6 → polyfill 路径未启用,H5 用 §7.5 的 `app_*.js` 文件路径作为唯一主路径。详细缘由见 Design §3.4.1(撤销说明)和 CLAUDE.md「典型案例」段。