业务期 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:
co-authored by
Claude Opus 4.7
parent
23b3a1fdad
commit
4986f36967
@@ -238,27 +238,36 @@ public final class WebContainerViewController: UIViewController {
|
||||
try writer.writeNetwork(NetworkMonitor.shared.currentCode)
|
||||
|
||||
let bridge = bridgedWebView.bridge
|
||||
let webView = bridgedWebView.webView
|
||||
|
||||
// 业务期变化时**不重写文件**,改为直接 evaluateJavaScript 重新赋值
|
||||
// window.app_* 全局变量(H5 已加载完,<script src> 不会再 fetch;
|
||||
// 重新赋值后 H5 业务期同步读 app_xxx 永远拿到最新值)。
|
||||
// 同时触发 §3.2 反向 callback 推送给注册了 handler 的 H5 业务。
|
||||
// 详见 docs/H5-Native-Implementation-Design.md §7.5.2 / §7.5.4。
|
||||
|
||||
// §3.2 [2] getBattery — UIDevice 电量变化
|
||||
// data: 字符串 "%.2f" 形式的小数电量
|
||||
BatteryMonitor.shared.onChange = { level in
|
||||
try? writer.writeBattery(level)
|
||||
bridge.call("getBattery",
|
||||
data: .string(String(format: "%.2f", level)),
|
||||
callback: nil)
|
||||
let value = String(format: "%.2f", level)
|
||||
Task { @MainActor in
|
||||
_ = try? await webView.evaluateJavaScript("window.app_getbattery=\(value);")
|
||||
}
|
||||
bridge.call("getBattery", data: .string(value), callback: nil)
|
||||
}
|
||||
|
||||
// §3.2 [3] getnetwork — NWPath 变化
|
||||
// data: 字符串 "1"=无网 / "2"=WiFi / "3"=蜂窝
|
||||
NetworkMonitor.shared.onChange = { code in
|
||||
try? writer.writeNetwork(code)
|
||||
bridge.call("getnetwork",
|
||||
data: .string("\(code)"),
|
||||
callback: nil)
|
||||
Task { @MainActor in
|
||||
_ = try? await webView.evaluateJavaScript("window.app_getnetwork=\(code);")
|
||||
}
|
||||
bridge.call("getnetwork", data: .string("\(code)"), callback: nil)
|
||||
}
|
||||
|
||||
// §3.2 [4] appservice — App 前后台切换(命名错位沿用历史)
|
||||
// data: "1"=进入后台 / "2"=回到前台
|
||||
// appservice 无对应 app_* 全局变量,只走 bridge.call 反向通知
|
||||
AppLifecycleObserver.shared.onBackground = {
|
||||
bridge.call("appservice", data: .string("1"), callback: nil)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user