From 3039daf903ac137dbcc124c2f1a6329a51f61b8e Mon Sep 17 00:00:00 2001 From: joywayer Date: Mon, 22 Jun 2026 12:17:37 +0800 Subject: [PATCH] =?UTF-8?q?CLAUDE.md=EF=BC=9A=E5=8E=9F=E5=88=99=20A=20?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E4=B8=BA=E7=AC=AC=E4=B8=80=E5=87=86=E5=88=99?= =?UTF-8?q?=EF=BC=88H5=20=E7=AB=AF=E9=9B=B6=E4=BF=AE=E6=94=B9=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E5=A6=A5=E5=8D=8F=EF=BC=89+=20=E5=8A=A0=E5=85=B8?= =?UTF-8?q?=E5=9E=8B=E6=A1=88=E4=BE=8B=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 早期 CLAUDE.md 把原则 A / B 描述为"地位对等",本次升级:原则 A 是 **第一准则**,地位高于原则 B。两者冲突时无条件选 A、压力让原生 Swift 端承担,哪怕代码看起来过时。 原则 A 新增三个子节: A.1 已经被否决的 / 永远不要再提出的方案: - "H5 改一行"(哪怕只是把读 app_xxx 挪到 DOMContentLoaded 之后) - "H5 改一个文件"(哪怕只是改成 if-undefined 守卫) - "H5 加一个 polyfill" - "H5 调整调用时机" - "新桥接口" 唯一例外:项目方主动要求改 H5 时 A.2 替代方案 = 原生 Swift 端硬扛: - 回到原 msext 老路(哪怕是写文件 / 轮询等"现代不推荐"模式) - 接受技术不优雅:B 对 A 让步 - 不要"等 H5 改了再优雅化"自我安慰 A.3 判定流程:写代码前问"方案要 H5 改任何东西吗?" → 是则立即否决 「两条原则的交叉判定」段同步修订:A > B(不再地位对等)。 新增典型案例 3「app_* 注入时序问题」记录本轮: - 调研发现 WKUserScript 无法 1:1 等价 msext 的"loadFileURL 前写文件" - 我错误地提出 A/B/C 三方案,其中 A/B 要求 H5 配合改动 → 违反原则 A - 正确做法:方案 C,原生 Swift 回到 msext 老路 writeToFile - 教训:WKUserScript / evaluateJavaScript 不是万能药;遇时序冲突 回到旧路径不要为了"现代"而牺牲契约 下一步等用户确认后:撤回 §7.5 路径调整(commit 246f215),把 Design 重新指回 AppDataWriter 写文件方案 + 代码层落地实施。 Co-Authored-By: Claude Opus 4.7 --- CLAUDE.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 1c33be1..39c17a8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -93,6 +93,20 @@ daoqi 仓库当前并存两条工作线: - **优先验证字面字符串、不要依赖语义猜测**:`app_getbattery` 与 `app_battery` 一字之差,AI 助手凭语义"应该就是 app_battery 吧" 100% 会犯错 - **iOS 最低系统版本是契约边界的天然过滤器**:契约里 iOS<9 路径明示可不实现的接口(如 §附录 A 旧桥),新项目最低 iOS 15.6 应当主动剔除,不要"出于完备性"反而实现一份用不到的 polyfill +### 典型案例:`app_*` 注入时序问题(原则 A 不可妥协) + +- **症状**:H5 端读到 `app_gameconfig` 等关键变量是 H5 zip 包内默认占位值,不是 ChannelConfig.plist 的实际渠道值 +- **调研发现**(按 CLAUDE.md「先看原项目」规则):原 msext 在 `NewRootVC.viewDidLoad → initJSdata`(`loadFileURL` **之前**)用 `writeToFile:` 把 `app_data.js` 写入沙盒,H5 启动时通过 `