Phase 4.C:QQShare URL Scheme 真实落地(不依赖 SDK)

移植 msext QQShareManager.m:716-771 simpleShareToQQFriend 简化版到 Swift。

QQShare.share 完整实现:
  - canOpenURL("mqqapi://") 检测 QQ 安装;未装返回 .notInstalled
  - 仅链接分享走完整 URL Scheme(type == "1");type == "2"/其它(截图 /
    远端图)暂返回 .success 避免 H5 业务卡住,Phase 4.F 接入
  - URL 构造(与 msext 等价):
    * scene == .timeline → mqqapi://share/to_qzone? (QQ 空间)
    * scene == .friend   → mqqapi://share/to_fri?   (QQ 好友)
    * 参数:version=1 + cflag=0 + req_type=1(无 url 时 req_type=0)+
      url=<encoded> + title=<encoded> + description=<encoded>
  - encode 函数与 msext QQShareManager.m:1262-1268 等价:仅保留 RFC 3986
    unreserved 字符(alphanumeric + "-._~"),其它全部 percent encode
  - canOpenURL 二次检查 + await UIApplication.open
  - 调起即视为 success(msext 同款乐观策略,URL Scheme 单向无返回)

Info.plist 新增 LSApplicationQueriesSchemes(iOS 9+ canOpenURL 白名单
要求,否则总返回 false):
  - mqq / mqqapi / mqqopensdkfriend / mqqopensdkapiV2/V3/V4(QQ 相关)
  - snssdk1128(抖音,Phase 4.D 用)
  - 微信相关待 Phase 4.E 接入 SDK 时再加(weixin / weixinULAPI 等)

BuildProject 通过

Plan §5 Phase 4.3 勾选

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-22 20:04:36 +08:00
co-authored by Claude Opus 4.7
parent 2ad4563d16
commit aff5ee7633
3 changed files with 88 additions and 15 deletions
+6 -3
View File
@@ -486,10 +486,13 @@ Contract Design Plan(本文档)
- `Source/Share/{Wechat,QQ,Douyin}Share.swift`:三个平台 stub(仅返回 success),Phase 4.C/4.D/4.E 升级
- `FriendsShareHandler` 升级:调 ShareCenter.dispatch + 完成后触发 sharesuccess 反向 callbacksuccess/cancelled 都发,notInstalled/failed 不发,沿用 msext 乐观策略)
- BuildProject 通过
- [ ] **4.3** **QQ 分享走 URL Scheme,不依赖 SDK**
- [x] **4.3** **QQ 分享走 URL Scheme,不依赖 SDK**4.C 完成)
- 移植 msext `QQShareManager.m:716-771` `simpleShareToQQFriend` 简化版
- URL 构造:`mqqapi://share/to_fri?version=1&cflag=0&req_type=1&url=...&title=...&description=...`
- `canOpenURL` 检查 + `openURL` 异步打开
- URL 构造:`mqqapi://share/to_fri?``mqqapi://share/to_qzone?`scene == .timeline 走 qzone+ `version=1&cflag=0&req_type=1&url=...&title=...&description=...`
- `encode` 与 msext line 1262-1268 等价:仅保留 RFC 3986 unreservedalphanumeric + `-._~`)其它 percent encode
- `canOpenURL` 检查 + `await UIApplication.open` 异步打开;调起即视为 success
- **当前仅链接分享**type == "1");type == "2" 截图 / 远端图 留 Phase 4.F
- Info.plist 加 `LSApplicationQueriesSchemes``mqq` / `mqqapi` / `mqqopensdkfriend` / `mqqopensdkapiV2/V3/V4`
- [ ] **4.4** **抖音分享走 URL Scheme + Photos,不依赖 SDK**
- 移植 msext `DouyinShareManager.m` 简化版
- URL Scheme`snssdk1128://share/video` / `snssdk1128://camera`