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>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
aa80aec18c
commit
a6095ef4c8
@@ -128,7 +128,7 @@ daoqi 仓库当前并存两条工作线:
|
|||||||
|
|
||||||
- **首选 SPM**:开源 / 官方提供 Swift Package 的库(Sentry / ZIPFoundation / 七牛 `https://github.com/qiniu/objc-sdk` v8.9.x 等)
|
- **首选 SPM**:开源 / 官方提供 Swift Package 的库(Sentry / ZIPFoundation / 七牛 `https://github.com/qiniu/objc-sdk` v8.9.x 等)
|
||||||
- **Vendor `.xcframework` 手动**:所有闭源二进制(微信 / 高德 AMap / opencore-amr 等),按 Design §14.1「Vendor 接入标准流程」放 `Vendor/<SDKName>/` + Target → General → Frameworks 加入 + `Vendor/<SDKName>/README.md` 记录版本与来源
|
- **Vendor `.xcframework` 手动**:所有闭源二进制(微信 / 高德 AMap / opencore-amr 等),按 Design §14.1「Vendor 接入标准流程」放 `Vendor/<SDKName>/` + Target → General → Frameworks 加入 + `Vendor/<SDKName>/README.md` 记录版本与来源
|
||||||
- **不接入 QQ SDK**:QQ 分享走 URL Scheme 直接调起 QQ app(`mqqapi://share/to_fri?...` 等),参 msext `QQShareManager.m` line 14 `__has_include` 条件编译的 fallback 路径。不需要 SDK、不需要 AppID 注册、不需要 handleOpenURL 回调(URL Scheme 单向调起,调起即视为 success)。Info.plist 仅需加 `LSApplicationQueriesSchemes`(`mqq` / `mqqapi` / `mqqopensdkfriend` 等)
|
- **不接入 QQ SDK / 也不实现 QQ 分享**:Contract §3.1 [2]`friendsShare.sharetype` 取值仅 "1"/"2"=微信 / "3"=闲聊,**无 QQ 选项**。msext 的 QQShareManager 只服务于原生 SharePanel(独立功能,不接 H5 桥)。新外壳契约不变 → H5 桥不实现 QQ 分享。如未来需 QQ 入口(原生 SharePanel-like),可走 URL Scheme 方案(`mqqapi://share/to_fri?...`,参 msext `QQShareManager.m:14` `__has_include` fallback)—— 但**不会触发 H5 桥 sharesuccess**,是独立于契约的另一条路径
|
||||||
- **禁止 CocoaPods**:项目内不放 `Podfile` / `Podfile.lock` / `Pods/` / `.xcworkspace`。工程入口固定为 `ylgamehall.xcodeproj`
|
- **禁止 CocoaPods**:项目内不放 `Podfile` / `Podfile.lock` / `Pods/` / `.xcworkspace`。工程入口固定为 `ylgamehall.xcodeproj`
|
||||||
- **新增第三方依赖时**:按 SPM → Vendor 顺序尝试,PR 描述写明选型理由;若发现某 SDK 既无 SPM 又无 XCFramework,回到 ADR-006 决策框架重新评估
|
- **新增第三方依赖时**:按 SPM → Vendor 顺序尝试,PR 描述写明选型理由;若发现某 SDK 既无 SPM 又无 XCFramework,回到 ADR-006 决策框架重新评估
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ Contract Design Plan(本文档)
|
|||||||
| 11 个渠道注入目录的目录名值 | 渠道 / 游戏 ID / 七牛域名 / market 等 | Phase 1 | 项目方/运营 |
|
| 11 个渠道注入目录的目录名值 | 渠道 / 游戏 ID / 七牛域名 / market 等 | Phase 1 | 项目方/运营 |
|
||||||
| 微信 OpenSDK `.framework` | 登录 / 分享 | Phase 4 | 项目方(可从 msext/Vendor 拷贝) |
|
| 微信 OpenSDK `.framework` | 登录 / 分享 | Phase 4 | 项目方(可从 msext/Vendor 拷贝) |
|
||||||
| 微信 AppID(`wx586a9b321e56efb7`)+ Universal Links 配置 | 微信回调 | Phase 4 | 项目方 |
|
| 微信 AppID(`wx586a9b321e56efb7`)+ Universal Links 配置 | 微信回调 | Phase 4 | 项目方 |
|
||||||
| ~~QQ OpenSDK `.framework` + AppID~~ | ~~QQ 分享~~ | **不需要** — 改用 `mqqapi://` / `mqq://` URL Scheme 直接调起 QQ app(参 msext `QQShareManager.m:14` `__has_include` fallback 路径),无需 SDK 无需 AppID 验证。仅需 Info.plist 加 `LSApplicationQueriesSchemes` (`mqq`/`mqqapi`/`mqqopensdkfriend` 等) | — |
|
| ~~QQ OpenSDK `.framework` + AppID~~ | ~~QQ 分享~~ | **不需要** — Contract §3.1 [2]`friendsShare` 的 `sharetype` 取值仅 "1"/"2"=微信 / "3"=闲聊,**没有 QQ 选项**。msext 里 QQShareManager 只服务于原生 SharePanel(独立功能),不接 H5 桥。新外壳契约不变 → 不实现 QQ 分享。grep 验证:msext `NewRootVC.m` / `gameController.m` 全文未引用 QQShareManager | — |
|
||||||
| 后台 `/wechat/login` 中转接口 | secret 不入 IPA 的前提 | Phase 4 | 后台团队 |
|
| 后台 `/wechat/login` 中转接口 | secret 不入 IPA 的前提 | Phase 4 | 后台团队 |
|
||||||
| 高德地图 `APIKey` + SDK XCFramework | 定位 | Phase 5 | 已有 key `b0d4a8e3fcbbcc0dd96283b7df6a4494`(但绑死 msext Bundle ID,需用新 Bundle ID 重新申请);SDK 走 Vendor 手动接入(ADR-006),下载页 https://lbs.amap.com/api/ios-location-sdk/download |
|
| 高德地图 `APIKey` + SDK XCFramework | 定位 | Phase 5 | 已有 key `b0d4a8e3fcbbcc0dd96283b7df6a4494`(但绑死 msext Bundle ID,需用新 Bundle ID 重新申请);SDK 走 Vendor 手动接入(ADR-006),下载页 https://lbs.amap.com/api/ios-location-sdk/download |
|
||||||
| 七牛上传 token 颁发接口 | 录音上传 | Phase 3 | 后台团队 |
|
| 七牛上传 token 颁发接口 | 录音上传 | Phase 3 | 后台团队 |
|
||||||
@@ -477,12 +477,9 @@ Contract Design Plan(本文档)
|
|||||||
- [ ] **4.1** `Vendor/WechatSDK/` 拷贝微信 SDK
|
- [ ] **4.1** `Vendor/WechatSDK/` 拷贝微信 SDK
|
||||||
- Info.plist 加 URL Scheme(`wx586a9b321e56efb7`)+ `LSApplicationQueriesSchemes`(`weixin` / `weixinULAPI` / `weixinURLParamsAPI`)
|
- Info.plist 加 URL Scheme(`wx586a9b321e56efb7`)+ `LSApplicationQueriesSchemes`(`weixin` / `weixinULAPI` / `weixinURLParamsAPI`)
|
||||||
- Entitlement 加 Associated Domains(Universal Links)
|
- Entitlement 加 Associated Domains(Universal Links)
|
||||||
- [ ] **4.2** **QQ 分享走 URL Scheme,不依赖 SDK**(按项目方约定)
|
- ✗ ~~**4.2** QQ 分享~~ **不实施**(按 A 方向最终决策)
|
||||||
- 参 msext `QQShareManager.m:14`(`__has_include(<TencentOpenAPI/QQApiInterface.h>)`)+ `:225-280` URL Scheme fallback 实现
|
- **理由**:H5 桥契约 §3.1 [2]`friendsShare.sharetype` 取值仅 "1"/"2"=微信 / "3"=闲聊,**无 QQ 选项**。msext 的 QQShareManager 只接原生 SharePanel(独立功能),不接 H5 桥。新外壳契约不变 → 不实现 QQ 分享
|
||||||
- Info.plist 加 `LSApplicationQueriesSchemes`:`mqq` / `mqqapi` / `mqqopensdkfriend` / `mqqopensdkapiV2` / `mqqopensdkapiV3` / `mqqopensdkapiV4` / `mqqopensdkdataline` 等(具体见 msext Info.plist)
|
- **保留路径**:未来项目方如确需 QQ 入口(如原生 SharePanel-like 触发),可参 msext `QQShareManager.m:14` `__has_include` fallback(URL Scheme `mqqapi://share/to_fri?` 直接调起),无需 SDK 无需 AppID。但**不会触发 H5 桥 `sharesuccess`**——这与契约无关,是另一条独立路径
|
||||||
- URL 构造(链接分享):`mqqapi://share/to_fri?` + URL 编码的 `title` / `description` / `url` / `thumbnailURL` / `version=1` / `src_type=app` 等参数
|
|
||||||
- 不需要 AppID 注册、不需要 QQApi handleOpenURL 回调(URL Scheme 单向调起,无回调)
|
|
||||||
- `sharesuccess` 反向 callback 无法精确判断分享成功失败(URL Scheme 不返回状态);msext 沿用"调起即视为 success"的乐观策略
|
|
||||||
- [ ] **4.3** `Source/SDK/WeChat/WeChatSDK.swift` 启动注册(Design §4.2 `registerFull` + 全部 12 个 `MMAPP_SUPPORT_*` flag)
|
- [ ] **4.3** `Source/SDK/WeChat/WeChatSDK.swift` 启动注册(Design §4.2 `registerFull` + 全部 12 个 `MMAPP_SUPPORT_*` flag)
|
||||||
- [ ] **4.4** `Source/SDK/WeChat/WeChatManager.swift`(@MainActor)
|
- [ ] **4.4** `Source/SDK/WeChat/WeChatManager.swift`(@MainActor)
|
||||||
- 持久 delegate
|
- 持久 delegate
|
||||||
@@ -788,7 +785,8 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin
|
|||||||
| 2026-06-22 | **Phase 2.C ExternalSubscriptions 生命周期管理**:setup/teardown 配对挂 viewWillAppear/viewWillDisappear,Phase 6 子游戏 push 时防双发 | `09f071e` |
|
| 2026-06-22 | **Phase 2.C ExternalSubscriptions 生命周期管理**:setup/teardown 配对挂 viewWillAppear/viewWillDisappear,Phase 6 子游戏 push 时防双发 | `09f071e` |
|
||||||
| 2026-06-22 | 新增 `docs/Verification-Checklist.md` 功能验证清单:累积各 Phase 验证步骤、不在 Phase 进行中频繁验证、完成后统一跑。与 Contract §10 契约边界保持独立 | `b2ee1b3` |
|
| 2026-06-22 | 新增 `docs/Verification-Checklist.md` 功能验证清单:累积各 Phase 验证步骤、不在 Phase 进行中频繁验证、完成后统一跑。与 Contract §10 契约边界保持独立 | `b2ee1b3` |
|
||||||
| 2026-06-22 | Phase 3.A srcIsloop 本地音频 + 3.B/C/D RemoteAudio stub。AudioPlayer @MainActor 实现 playOnce/loopBackground/stopBackground 三方法与 msext 等价 | `0602b9d` |
|
| 2026-06-22 | Phase 3.A srcIsloop 本地音频 + 3.B/C/D RemoteAudio stub。AudioPlayer @MainActor 实现 playOnce/loopBackground/stopBackground 三方法与 msext 等价 | `0602b9d` |
|
||||||
| 2026-06-22 | **Phase 4.A 登录+分享 stub + QQ 改走 URL Scheme 不依 SDK**:AccreditLoginHandler + FriendsShareHandler stub;Plan §2.3 阻塞表去掉 QQ SDK;Plan §5 4.2 改为 URL Scheme 路径(参 msext QQShareManager.m fallback);CLAUDE.md 依赖管理段补"不接入 QQ SDK"约定;Verification-Checklist 加 Phase 4 章节 | 本次 commit |
|
| 2026-06-22 | **Phase 4.A 登录+分享 stub + QQ 改走 URL Scheme 不依 SDK**:AccreditLoginHandler + FriendsShareHandler stub;Plan §2.3 阻塞表去掉 QQ SDK | `aa80aec` |
|
||||||
|
| 2026-06-22 | **Phase 4 方向最终决策(A)**:grep msext NewRootVC.m / gameController.m 未发现 QQShareManager 引用 — Contract §3.1 [2] `sharetype` 取值仅"1"/"2"=微信 / "3"=闲聊无 QQ;msext 的 QQShareManager 只接原生 SharePanel(独立功能不接 H5 桥)。新外壳契约不变 → 不实现 QQ 分享。Plan §2.3 + §5 4.2 + CLAUDE.md + Verification-Checklist 同步调整为"不实施"+ 保留 URL Scheme 备用知识库 | 本次 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「典型案例」段。
|
> **§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「典型案例」段。
|
||||||
|
|
||||||
|
|||||||
@@ -185,12 +185,11 @@ H5 需先用 `bridge.registerHandler('callbackName', fn)` 注册:
|
|||||||
> - sharesuccess({success:"2", type:"1"/"2"})
|
> - sharesuccess({success:"2", type:"1"/"2"})
|
||||||
> - app 切到后台微信授权 → 切回 app sharelogin 触发
|
> - app 切到后台微信授权 → 切回 app sharelogin 触发
|
||||||
|
|
||||||
### L. QQ URL Scheme 分享(4.C 待实现,**不依赖 SDK**)
|
### L. ~~QQ URL Scheme 分享~~(不实施,按 A 方向最终决策)
|
||||||
|
|
||||||
> 移植 msext QQShareManager.m URL Scheme fallback 后填充。预备验证项:
|
> Contract §3.1 [2]`sharetype` 取值仅 "1"/"2"=微信 / "3"=闲聊,无 QQ 选项。
|
||||||
> - 链接分享 → `mqqapi://share/to_fri?` 调起 QQ app
|
> msext 的 QQShareManager 只服务于原生 SharePanel,不接 H5 桥。新外壳契约
|
||||||
> - 朋友圈分享 → `mqqapi://share/to_qzone?` 调起 QQ 空间
|
> 不变 → 不实现 QQ 分享,无需验证。
|
||||||
> - 调起即视为 success(URL Scheme 单向无返回,msext 同款乐观策略)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user