diff --git a/docs/Development-Plan.md b/docs/Development-Plan.md index 85f7431..dcc8cc8 100644 --- a/docs/Development-Plan.md +++ b/docs/Development-Plan.md @@ -768,7 +768,8 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin | 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` 全局变量」 | `246f215` | | 2026-06-22 | **CLAUDE.md 原则 A 升级为第一准则**:H5 端零修改不可妥协,禁止任何"H5 改一行 / 改一个文件 / 加 polyfill / 调时机"的妥协方案。加典型案例 3 复盘 `app_*` 注入时序问题 | `3039daf` | -| 2026-06-22 | **§7.5 路径再次回退(最终)**:撤销 `246f215`,回到 msext 原写文件路径 `AppDataWriter`。原因:WKUserScript 时序(documentStart 被 H5 自带 var 覆盖、documentEnd 又太晚)无法 1:1 等价 msext,任何要求 H5 配合改动的方案违反原则 A 第一准则。Design §7.5 + Contract §4.2 + §10 全面同步回退 | 本次 commit | +| 2026-06-22 | **§7.5 路径再次回退(最终)**:撤销 `246f215`,回到 msext 原写文件路径 `AppDataWriter`。原因:WKUserScript 时序(documentStart 被 H5 自带 var 覆盖、documentEnd 又太晚)无法 1:1 等价 msext,任何要求 H5 配合改动的方案违反原则 A 第一准则。Design §7.5 + Contract §4.2 + §10 全面同步回退 | `13cc24b` | +| 2026-06-22 | **AppDataWriter 代码落地**:新增 `Source/WebView/AppDataWriter.swift` + `Source/Resource/NetworkMonitor.swift`;WebContainer.runBootPipelineSteps 在 step 5 后、step 6 loadFileURL 前调 `writeAppDataFiles(resolved:)` 写 4 个 app_*.js 文件 + 挂 battery/network 变化重写监听。BuildProject 通过 | 本次 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/ylgamehall/Source/Resource/NetworkMonitor.swift b/ylgamehall/Source/Resource/NetworkMonitor.swift new file mode 100644 index 0000000..2f86eb5 --- /dev/null +++ b/ylgamehall/Source/Resource/NetworkMonitor.swift @@ -0,0 +1,48 @@ +// +// NetworkMonitor.swift +// ylgamehall +// +// NWPathMonitor 的最简 wrap:提供 currentCode 同步快照 + onChange 事件回调。 +// 用于 AppDataWriter.writeNetwork(_:) 拿首次值 + 变化重写 app_network.js。 +// 详见 docs/H5-Native-Implementation-Design.md §7.5 / §8.4。 +// + +import Foundation +import Network + +/// `app_getnetwork` 的语义码(与 msext 沿用): +/// 1 = 无网,2 = WiFi,3 = 蜂窝 +@MainActor +public final class NetworkMonitor { + + public static let shared = NetworkMonitor() + + public private(set) var currentCode: Int = 2 + + /// 网络变化回调。每次状态变化时主线程触发。 + public var onChange: (@MainActor (Int) -> Void)? + + private let monitor = NWPathMonitor() + private let queue = DispatchQueue(label: "ylgamehall.networkmonitor", qos: .utility) + private var started = false + + public init() {} + + public func start() { + guard !started else { return } + started = true + monitor.pathUpdateHandler = { [weak self] path in + let code: Int = { + if path.status != .satisfied { return 1 } + if path.usesInterfaceType(.wifi) { return 2 } + return 3 + }() + Task { @MainActor in + guard let self else { return } + self.currentCode = code + self.onChange?(code) + } + } + monitor.start(queue: queue) + } +} diff --git a/ylgamehall/Source/WebView/AppDataWriter.swift b/ylgamehall/Source/WebView/AppDataWriter.swift new file mode 100644 index 0000000..af9911d --- /dev/null +++ b/ylgamehall/Source/WebView/AppDataWriter.swift @@ -0,0 +1,171 @@ +// +// AppDataWriter.swift +// ylgamehall +// +// H5 app_*.js 预注入文件机制 — 在 loadFileURL 之前写 4 个 .js 文件到沙盒, +// H5 业务通过