 joywayerandClaude Opus 4.7
|
b071ced657
|
Phase 4 方向再次纠正:撤销 A,QQ + 抖音 SharePanel 三选一不依 SDK
用户提示"原项目还有 QQ 分享、抖音分享"。深度调研发现:
上一轮 A 方向决策 (a6095ef) 错了 — grep 范围之前仅看 NewRootVC.m,
漏了 gameController.m。msext gameController.m:575-597 显示 H5 调
friendsShare 时原生**弹 SharePanel 三选一面板**:
sharefriend == 1 → SharePanel.showWithDictionary(微信好友 / QQ / 抖音)
sharefriend == 2 → WechatShareManager.shareWithContent(朋友圈)
Contract §3.1 [2]旧描述(sharetype=3 闲聊)已被 msext 新代码覆盖;
sharetype 字段在新代码里读了但不用。
调研 QQ + 抖音是否需要 SDK:
- QQShareManager.m:14: __has_include(<TencentOpenAPI/QQApiInterface.h>)
条件编译 + line 716-771 simpleShareToQQFriend URL Scheme fallback
(mqqapi://share/to_fri?...) — **不依赖 SDK**
- DouyinShareManager.m: 只 import Photos + MobileCoreServices;
全程 URL Scheme(snssdk1128://share/video / camera)+ 保存截图到
相册让用户在抖音里选 — **不依赖 SDK**
撤销 A 决策。新方向(Plan §5 4.2-4.4):
- 4.2 SharePanel 三选一面板(msext gameController.m:585 等价行为)
- 4.3 QQShare URL Scheme(移植 simpleShareToQQFriend)
- 4.4 DouyinShare URL Scheme + Photos
- 4.5(原 4.B)微信 SDK 接入(仍需项目方提供 framework + AppID + UL)
文档同步:
- Plan §2.3 阻塞表:QQ 改为"不需要 SDK,走 URL Scheme";抖音同款
- Plan §5 Phase 4:4.2 重写为 SharePanel 设计 + 4.3 QQ + 4.4 抖音 + 4.5 微信
- CLAUDE.md 依赖管理段:"不接入 QQ SDK / 也不接入抖音 SDK",
含 LSApplicationQueriesSchemes + NSPhotoLibraryAddUsageDescription 说明
- Verification-Checklist L/M/N 章节:SharePanel + QQ + 抖音验证项
- Plan §6.4 里程碑加纠正记录(标 a6095ef 已撤销)
下一步:代码实施 4.B SharePlatform 协议 + SharePanel UI + ShareCenter 分发。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-22 19:59:00 +08:00 |
|
 joywayerandClaude Opus 4.7
|
a6095ef4c8
|
Phase 4 方向最终决策 A:QQ 不在 H5 桥范围,不实施
深度 grep msext NewRootVC.m / gameController.m 未发现 QQShareManager
引用 — QQ 完全不接 H5 桥。Contract §3.1 [2] sharetype 取值仅 "1"/"2"=
微信 / "3"=闲聊,无 QQ 选项。
按 CLAUDE.md 原则 A(H5 端零修改不可妥协):契约不变 → H5 桥不实现
QQ 分享。msext 里 QQShareManager 只服务于原生 SharePanel(独立功能),
新外壳无原生 SharePanel-like 入口需求 → 也不需要 QQShareManager。
文档同步调整为"不实施":
- Plan §2.3 阻塞表:QQ OpenSDK 改写为详细理由(H5 桥契约无 QQ
选项 + msext QQShareManager 不接 H5 桥的 grep 证据)
- Plan §5 Phase 4.2:从"QQ 改走 URL Scheme"改为"不实施",但保留
URL Scheme 备用知识库(未来如需原生入口可参 msext fallback)
- CLAUDE.md 依赖管理段:"不接入 QQ SDK 也不实现 QQ 分享",明示
原因(契约无 QQ + msext 行为)
- Verification-Checklist L 章节:QQ 验证项删除(不实施无需验证)
Phase 4 至此剩 4.B 微信 SDK 接入(项目方阻塞)+ 4.D 截图/远端图分享
(依赖 4.B)。当前 stub 已让 H5 调登录/分享不报 "no handler",
等微信 SDK 到位后升级。
Plan §6.4 里程碑加一行决策记录。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-22 19:45:12 +08:00 |
|
 joywayerandClaude Opus 4.7
|
aa80aec18c
|
Phase 4.A:登录+分享 stub + QQ 改走 URL Scheme 不依 SDK
按用户约定调整 Phase 4 方向:微信继续走 SDK(等项目方提供),QQ 分享
改用 URL Scheme 直接调起 QQ app,**不依赖 SDK**。
调研 daoqi/msext/Class/Utils/QQShareManager.m 发现已有完整的 URL Scheme
fallback 路径:
- line 14: __has_include(<TencentOpenAPI/QQApiInterface.h>) 条件编译
- line 231 注释: "Fallback: 使用 URL Scheme (mqqapi://) - 无需 SDK,
直接调起 (Legacy)"
- mqqapi://share/to_fri / mqqapi://share/to_qzone / mqqopensdkfriend://share
等 schema 实现见 line 733/786/789
新增 handler stub(让 H5 启动 / 业务期调登录 / 分享不报 "no handler"):
- Source/Bridge/Handlers/AccreditLoginHandler.swift
accreditlogin cb "Response from accreditlogin"
完整实现需 Phase 4.B 微信 SDK + WeChatManager.authorize() + WeChatAuth.exchangeForUser
+ bridge.call("sharelogin", 7 字段含大写 Province) 反向 callback
- Source/Bridge/Handlers/FriendsShareHandler.swift
friendsSharetypeUrlToptitleDescript cb "sharefriend"
完整实现需 ShareCenter 策略分发 + sharesuccess 反向 callback
WebContainer.registerBridgeHandlers 接入。
文档调整:
- Plan §2.3 阻塞表:QQ OpenSDK 标"不需要",改 URL Scheme 路径
- Plan §5 Phase 4 前置:去掉 QQ OpenSDK 一行
- Plan §5 Phase 4.2:完整改写为 URL Scheme 方案,含 LSApplicationQueriesSchemes
清单 + URL 构造样例 + "调起即 success" 乐观策略说明
- Plan §8 进度追踪:4.2 QQ SDK Vendor 标"不需要"
- Plan §6.4 里程碑加 3 行(前两轮 commit hash 补 + 本次)
- CLAUDE.md 依赖管理段加 "不接入 QQ SDK" 约定(与"不引入 CocoaPods"
并列的负面清单)
- Verification-Checklist Phase 4 章节:E.19/E.20 stub + K/L 待 4.B/4.C
完整后填充验证项
BuildProject 通过
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-22 19:19:23 +08:00 |
|
 joywayerandClaude Opus 4.7
|
b2ee1b38eb
|
新增 Verification-Checklist 功能验证清单 + Phase 1-2 验证步骤
按用户指示:功能验证写到专门的文档用来说明指导,等功能开发完毕统一
验证,不在 Phase 进行中频繁跑(避免反复重装 app 浪费时间)。
新增 docs/Verification-Checklist.md:
- 文档定位:开发期累积 / 统一验收的操作手册,与 Contract §10
契约边界保持独立
- 通用准备:环境工具(Xcode console / Safari Web Inspector / 模拟器
Features 菜单)+ 重装 app 清 launch snapshot + xcrun simctl
get_app_container 沙盒访问
- Phase 1 章节(已实现):
A. 启动图 + LaunchScreen 方向(3 项)
B. 启动流水线时序(含 Xcode console 期望输出 + 黑边 + 总耗时)
C. app_*.js 落盘 + 命名(含 cat 命令)— 6 项硬约束
D. window.app_* H5 console 对账(15 项变量 + 撤销变量验证)
- Phase 2 章节(已实现):
E. H5→Native handler 响应(13 项验证步骤)
F. Native→H5 反向 callback(5 项触发场景含模拟器手动操作)
G. ExternalSubscriptions 生命周期(Phase 6 才能完整验证)
- Phase 3-10 占位章节:实施后陆续填充
- 附录:与 Contract §10 26 项验收清单的章节映射表
- 维护规则:每完成 Phase 子项补勾、不复制到 Contract §10、bug 修复
时在 commit message 引用本文档 checkbox 编号
CLAUDE.md 文档索引表新增一行指向 Verification-Checklist.md。
Plan §6.4 里程碑加 3 行(前面遗漏的 4986f36 / 09f071e + 本次 commit)。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-22 19:08:32 +08:00 |
|
 joywayerandClaude Opus 4.7
|
3039daf903
|
CLAUDE.md:原则 A 升级为第一准则(H5 端零修改不可妥协)+ 加典型案例 3
早期 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 <noreply@anthropic.com>
|
2026-06-22 12:17:37 +08:00 |
|
 joywayerandClaude Opus 4.7
|
fae7b3da82
|
CLAUDE.md:新增第 2 个典型案例「H5 与原生通讯接口的真实路径」
补在 LaunchScreen 案例后,记录本轮发现:
- 症状:基于 Contract §附录 A 实现 window.settings.getXxx() polyfill 后
H5 行为不对,user 反馈"读不到数据"
- 错误做法:把附录 A 9 项 getter 实现为 polyfill,认为是 H5 主路径
- 原项目真相:grep "var app_" 在 daoqi/msext NewRootVC.m:1204 /
gameController.m:2160 / AppDelegate.m:259,发现 H5 主路径是写 .js 文件
+ <script src> 同步引入预生成的全局变量(不是 polyfill 函数)
- 同时发现 Contract §4.2 本身也写错(漏 6 项 / 多 2 项 / 文件名变量名混淆)
- 修复:撤销 §3.4.1 polyfill / 新增 §7.5 app_*.js 预注入 / 全面修订
Contract §4.2
教训 3 条:
1. 文档与代码冲突时原项目代码是真理。Contract 也可能写错(10 年前
写就的文档遗漏/误传是常态),必须用 grep 验证字面字符串
2. 优先验证字面字符串、不要依赖语义猜测:app_getbattery vs app_battery
一字之差,凭"应该就是 app_battery 吧"100% 犯错
3. iOS 最低系统版本是契约边界的天然过滤器:契约明示可不实现的旧接口
新项目应主动剔除,不要"出于完备性"反而做一份用不到的实现
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-22 07:59:17 +08:00 |
|
 joywayerandClaude Opus 4.7
|
a20498f898
|
CLAUDE.md:新增「参考原项目 daoqi」规则 + LaunchScreen 典型案例
新增「原项目 daoqi:遇到问题时的参考来源」段:
- 明确原 daoqi 项目路径 ../daoqi/(与 ylgamehall 同级目录)
- 列出何时主动去读原项目(iOS 行为不符预期 / Info.plist 不确定 / 桥接
字段 / SDK 时序 / 渠道注入 / 老 hack 等)
- 怎么用原项目(先查关键文件 → grep 同名 key → 看 git log → 对照差异)
- 与「原则 B:内部自由重构」不冲突:参考是"必须做的清单"和"已踩过的坑"
备忘,不是"实现细节照抄"
新增 LaunchScreen orientation 典型案例:
- 症状:启动图横躺被旋转 90°
- 错误做法:凭文档推测、纯调 storyboard / contentMode / 反复换素材
- 去原项目找到 msext 用 LaunchImage Asset Catalog(iOS 8 时代)的"按
orientation 自动旋转 portrait 资源"魔法 — 这套机制 iOS 14+ 已 deprecated
- 新项目用 LaunchScreen.storyboard 没有自动旋转,必须三步组合:
1. 素材物理像素就是横屏(sips -r -90 一次性旋转 msext 残留 portrait 素材)
2. Info.plist 显式补无后缀 UISupportedInterfaceOrientations
3. UIImageView scaleAspectFit + 黑底
- iOS launch snapshot 缓存粘滞:开发期改启动相关任意一项后必须卸载重装
才能看到新效果;终端用户不受影响
文档索引表加入 ../daoqi/ 一行,加突出可见性。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-22 03:59:29 +08:00 |
|
joywayer
|
87304552c3
|
docs:勾选 Plan §5 / §8 Phase 1.10-1.13 进度 + CLAUDE.md 新增「进度同步规范」
把 Plan 任务清单和进度追踪 checklist 同步到当前实际进度(1.10-1.13
均已完成 + 实测验证),并在 CLAUDE.md 写入"每完成 Phase 子项必须立即
更新 Plan 进度"的硬约束。
- Plan §5 Phase 1.10-1.13 任务清单 [ ] → [x]
- Plan §8 进度追踪同步:标注算法名 / 端到端实测结果(260→261 验证)
- CLAUDE.md 新增「进度同步规范」节,规定:
- Plan §5 + §8 每完成子项立即勾选,与 commit 同 commit 内完成
- 任务描述与实现有差异时同步修订(不允许 Plan 与代码长期不一致)
- commit message 末尾备注"Plan 进度已勾选"
- 理由:Plan 是项目记忆的唯一权威进度视图,新人 clone 后看 Plan
§8 即可知整体进度;与 commit log 双写互为校验
Plan 进度已勾选
|
2026-06-22 02:30:31 +08:00 |
|
joywayer
|
cabdc1ed42
|
docs:剥离 docs/res/ 为私人素材池,废止仓库根 Resources/ 假设
明确 docs/res/ 是项目维护者的私人原始素材池,与项目架构无关;项目
代码 / 构建脚本 / Xcode 工程都不感知它的存在,需要时从中拷一份到
项目按现代实践规划的位置。原 ADR-004「Resources/ 在仓库根 +
Build Phase 引入」语义已崩塌(gamehall.zip / Images.xcassets / Res/
均被挪入 docs/res/),修订为「项目内资源目录由各 Phase 按需落地」:
静态 Bundle 资源走 ylgamehall/Resources/、原生 Asset Catalog 走
ylgamehall/Assets.xcassets/、渠道注入产物走 ylgamehall/ChannelInjection/
(.gitignore + Scripts/inject_channel.sh 生成)、闭源 SDK 走 Vendor/。
- CLAUDE.md 原「Resources/ 目录约定」节改写为「docs/res/ 与项目
资源的关系」,禁止把 docs/res 当项目资源目录使用
- Design §7.0 整节重写为「项目资源目录约定」三小节(docs/res
与项目无关 / 项目内资源目录在 Phase 实施时按需落地 / 渠道注入
运行时路径)
- Plan ADR-004 修订为「项目资源目录由各 Phase 按需落地」;ADR-002
/ §2.2 / Phase 1.1.a-d / 1.5 同步调整为 docs/res → ylgamehall/Resources
的拷贝模型;Phase 1 任务清单细化渠道注入由 Scripts/inject_channel.sh
生成
- 物理迁移:仓库根 Resources/gamehall.zip / Images.xcassets / Res/
全部 rename 到 docs/res/(git rename detection 自动识别)
|
2026-06-21 22:32:38 +08:00 |
|
joywayer
|
17a8b96cf8
|
docs:依赖管理改为纯 SPM + Vendor,移除 CocoaPods(ADR-006)
调研发现 Qiniu SDK 已官方支持 SPM(https://github.com/qiniu/objc-sdk
v8.9.x),AMap 仍仅支持 CocoaPods 或手动 XCFramework;CocoaPods 1.15.2
不兼容 Xcode 26 的 PBXFileSystemSynchronizedRootGroup,需绕道 Bundler
才能升到 1.16+。综合性价比决定不引入 CocoaPods 工具链,所有闭源 SDK
(含 AMap)统一走 Vendor .xcframework 手动接入。
- Design §14.1 三层策略改写为两层(SPM + Vendor),新增 Vendor 接入
标准流程 6 步法
- Design §14.2 AMap 接入方式从 CocoaPods 改为 Vendor,Qiniu 标注 SPM
URL 与版本
- Plan §2.3 / §5 Phase 5.1 / §6.1 / §8 同步 AMap Vendor 化
- Plan 新增 ADR-006 完整决策记录
- CLAUDE.md 新增「依赖管理约定」节,禁止引入 CocoaPods
|
2026-06-21 21:46:19 +08:00 |
|
joywayer
|
d18ea4f1c5
|
新增所需资源,修改优化文档
|
2026-06-21 20:40:46 +08:00 |
|
joywayer
|
1da2884358
|
CLAUDE.md:新增「及时提交」规则到提交规范
每完成一个可独立验证的工作单元(bug 修复 / 配置变更 /
文档更新 / 依赖升级 / M 里程碑子项)就主动提议提交,
BuildProject 通过 / 关键路径手测通过即立即提议。
理由:项目处于 greenfield 重写阶段,commit 颗粒越小
回滚成本越低;CLAUDE.md / docs 与 git log 一起构成
项目记忆,commit message 是"为什么"的第一现场。
|
2026-06-21 20:03:14 +08:00 |
|
joywayer
|
beb05ab451
|
添加文档和CLAUDE.md
|
2026-06-21 19:39:22 +08:00 |
|