Commit Graph
5 Commits
Author SHA1 Message Date
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 0602b9d4b6 Phase 3.A:srcIsloop 本地音频 + 3.B/3.C/3.D handler stub
3.A 本地音频完整落地(与 msext NewRootVC initJSdata 等价):

  Source/Audio/AudioPlayer.swift(@MainActor 状态机):
    - playOnce(url) 单次按钮音;buttonPlayers 数组保活池避免多次点击
      互相打断(duration + 0.5s 后清理)
    - loopBackground(url, type:) 循环背景音;numberOfLoops = -1 +
      backgroundType 记录用于同名停止
    - stopBackground(type:) 同名校验后才停止(msext 同款语义)

  Source/Bridge/Handlers/LocalAudioHandler.swift:
    - 注册 srcIsloop handler(@MainActor enum)
    - 入参 src + isloop,按 0/1/-1 分支调 AudioPlayer.shared 对应方法
    - audioFileURL 路径:{Caches}/{gamedir}/{gamestart}/assets/wav/{src}
      与 msext NewRootVC 路径约定 1:1(H5 zip 内 assets/wav 子目录)
    - audioFileURL 标 nonisolated 因 SandboxPaths 是 nonisolated 静态
    - cb 字面 "Response from srcIsloop" 严格保持

  Source/Bridge/Handlers/RemoteAudioHandler.swift(3.B/3.C/3.D stub):
    - prepareaudio + mediaTypeAudio 仅 cb 维持契约,无真实业务
    - 待 Phase 3.B(opencore-amr .a 接入)+ 3.C(七牛 SPM + token)+
      3.D(远端播放)完整后升级
    - 按 CLAUDE.md 原则 A:H5 调啥就得有人接,即使是 stub

WebContainerViewController.registerBridgeHandlers 接入:
  - LocalAudioHandler.register(完整实现)
  - RemoteAudioHandler.register(stub)

Plan §5 Phase 3.1 勾选;3.2 真机验证留待 H5 提供音频文件后做。

Verification-Checklist.md 新增 Phase 3 章节:
  - H. 本地音频(E.14-E.16 srcIsloop 三个 isloop 值)
  - I. prepareaudio / mediaTypeAudio stub(E.17 E.18)

BuildProject 通过

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-22 19:11:34 +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