业务期 app_getbattery / app_getnetwork 改为 evaluateJavaScript 重新赋值

按用户指示调整变化时机制:

  启动期(保持):loadFileURL 之前写 4 个 app_*.js 文件,H5 同步
    <script src> 引入读到实际值

  业务期(调整):变化时**不重写文件**,改为
    webView.evaluateJavaScript("window.app_getbattery=N;") 直接重新赋值
    全局变量。原因:H5 已加载完后 <script src> 不会再 fetch,重写文件
    对当前页面无影响(仅影响下次 reload),改 evaluateJavaScript 即时
    生效 + 无文件 IO 开销。

  与 §3.2 反向 callback 双轨同时执行:
    - evaluateJavaScript 让 H5 业务期同步读 app_xxx 永远拿到最新值
    - bridge.call 让 H5 注册的 callback handler 收到事件主动响应

WebContainerViewController.writeAppDataFiles 改动:
  - BatteryMonitor.onChange:Task @MainActor await
    webView.evaluateJavaScript("window.app_getbattery=N;") + bridge.call
  - NetworkMonitor.onChange:同款 evaluateJavaScript + bridge.call
  - AppLifecycleObserver:appservice 无对应 app_* 全局变量,只走 bridge.call

文档同步:
  - Design §7.5.2 改为「两阶段」表述:启动期写文件 + 业务期 evaluateJavaScript
  - Design §7.5.4 接入点代码示例同步
  - Contract §4.2 app_battery.js / app_network.js 子节更新时机段
  - Contract §4.2 修订记录加一行
  - Plan §6.4 里程碑加一行 + 前两轮 commit hash 补充

BuildProject 通过

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-22 18:50:53 +08:00
co-authored by Claude Opus 4.7
parent 23b3a1fdad
commit 4986f36967
4 changed files with 81 additions and 38 deletions
+10 -8
View File
@@ -766,10 +766,12 @@ var app_invitationcode = '<tuiguang_id>'; // 推广码 / 邀请码
var app_getbattery = 0.85; // ⚠️ 变量名带 getmsext "var app_getbattery=%lf" double 字面
```
更新时机:
- `loadFileURL` 之前一次(保证 H5 启动就能读到当前电量)
- `UIDevice.batteryLevelDidChangeNotification` 触发重写
- `UIApplication.willEnterForegroundNotification`(前台切换补 retroact
更新时机(启动期写文件 + 业务期 evaluateJavaScript 重新赋值,**不重写文件**)
- 启动期:`loadFileURL` 之前一次首次值(保证 H5 启动同步读到当前电量)
- 业务期:`UIDevice.batteryLevelDidChangeNotification` 触发 → 原生执行
`webView.evaluateJavaScript("window.app_getbattery=N;")` 重新赋值 H5 全局变量
**不重写文件**H5 已加载完,`<script src>` 不会再 fetch,重写文件对当前页面无影响)
- 同时触发 §3.2 2]反向 callback `getBattery` 给注册了 handler 的 H5 业务
#### `app_network.js`(写到 `{gamedir}/{gamestart}/app_network.js`
@@ -777,10 +779,9 @@ var app_getbattery = 0.85; // ⚠️ 变量名带 getmsext "var app_getbatt
var app_getnetwork = 2; // ⚠️ 变量名带 getmsext "var app_getnetwork=%d" int 字面:1 无网 / 2 WiFi / 3 蜂窝
```
更新时机:
- `loadFileURL` 之前补一次
- `NWPathMonitor` 状态变化msext 用 AFNetworkReachability,新外壳用 NWPathMonitor
- 前台切换
更新时机(同 app_battery.js
- 启动期:`loadFileURL` 之前写首次值
- 业务期:`NWPathMonitor` 状态变化`webView.evaluateJavaScript("window.app_getnetwork=N;")` 重新赋值(不重写文件)+ §3.2 [3]反向 callback `getnetwork`
#### `app_gamesname.js`(写到 `{gamedir}/{gamestart}/app_gamesname.js`
@@ -804,6 +805,7 @@ var app_gamesname = new Array('game1','game2',...); // ⚠️ var 后面两
| 2026-06-22 | **路径调整**:从"原生 `writeToFile` 写 4 个 `.js` 文件"改为"H5 团队 zip 包自带 + 原生 `WKUserScript(.atDocumentEnd)` / `evaluateJavaScript` 覆盖 `window.app_xxx` 全局变量值" | H5 团队 / 项目方约定 |
| 2026-06-22 | **路径再次调整(最终)**:撤销上一行的 evaluateJavaScript 路径,回到原 msext "原生 `writeToFile` 写文件"路径。原因:WKUserScript 时序无法 1:1 等价 msext`.atDocumentStart` 被 H5 自带 var 覆盖,`.atDocumentEnd` 太晚 H5 业务已读默认值),任何要求 H5 配合改动的方案违反 CLAUDE.md 原则 A 第一准则。Design §7.5 + 本节同步回退 | CLAUDE.md 原则 A 升级为第一准则后的重新评估 |
| 2026-06-22 | **`app_appversion` 业务语义重大纠正**:早期文档把 `app_appversion` 描述为"App 的版本号字符串",实际是 msext `NewRootVC.m:1190-1208` 的审核切换标志(`'0'``'1'`)。当远端 < 本地时切到 `'1'` + `app_gameconfig` 切到 `BundleConfig.appleConfig`(审核期接口);其它情况都是 `'0'` + `gameConfig`(正常业务)。`app_gameconfig` 数据源同步从"硬编码 gameConfig"改为"动态切换 gameConfig/appleConfig"。Design §7.5.1 同步、代码 AppDataWriter.writeAppData 修复 | daoqi `NewRootVC.m:1190-1208` initJSdata 全面 grep 重读 |
| 2026-06-22 | **业务期 `app_getbattery` / `app_getnetwork` 改为 evaluateJavaScript 重新赋值(不重写文件)**:启动期保持写文件(H5 同步 `<script src>` 需要文件存在);业务期变化时不再重写 `app_battery.js` / `app_network.js`H5 已加载完 `<script src>` 不会再 fetch,重写无效),改为 `webView.evaluateJavaScript("window.app_xxx=N;")` 直接重新赋值全局变量。与 §3.2 反向 callback 双轨同时执行 | WebContainerViewController.writeAppDataFiles 优化(用户指示) |
### 4.3 WKUIDelegateH5 alert / confirm