From 246f215d6f16a373951f8db0cea0a8b2f3d6ee22 Mon Sep 17 00:00:00 2001 From: joywayer Date: Mon, 22 Jun 2026 08:19:53 +0800 Subject: [PATCH] =?UTF-8?q?=C2=A77.5=20=E9=87=8D=E5=A4=A7=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E8=B0=83=E6=95=B4=EF=BC=9Aapp=5F*=20=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=20evaluateJavaScript=20=E8=A6=86=E7=9B=96=20window.ap?= =?UTF-8?q?p=5Fxxx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/Development-Plan.md | 1 + docs/H5-Native-Contract.md | 59 ++-- docs/H5-Native-Implementation-Design.md | 341 ++++++++++++++++++------ 3 files changed, 309 insertions(+), 92 deletions(-) diff --git a/docs/Development-Plan.md b/docs/Development-Plan.md index 27bc7b0..181510e 100644 --- a/docs/Development-Plan.md +++ b/docs/Development-Plan.md @@ -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「典型案例」段。 diff --git a/docs/H5-Native-Contract.md b/docs/H5-Native-Contract.md index 3b5851f..bf8f59c 100644 --- a/docs/H5-Native-Contract.md +++ b/docs/H5-Native-Contract.md @@ -690,18 +690,31 @@ _webView.scrollView.showsHorizontalScrollIndicator = NO; - LocalStorage 由 H5 自管(WKWebView 默认走 WebsiteDataStore) - 加载方式:**`loadFileURL:fileURL allowingReadAccessToURL:dirURL`**(file://),不走 HTTP -### 4.2 JS 注入(**已按原项目代码全面修订** — 见底部"修订记录") +### 4.2 JS 注入(**2026-06-22 重大路径调整:原生不写文件,只覆盖 `window.app_xxx` 全局变量**) -H5 业务通过 `