4.B 分享逻辑对齐 daoqi msext:调用即触发 sharesuccess

【契约影响】docs/H5-Native-Contract.md §3.1[2]/§3.2[11]

H5 端 sharesuccess 时机改为"调用 friendsShare handler 即立刻发",与
原 msext 行为等价(live path 完全不等 SDK / URL Scheme 回包)。用户
明示有意为之:URL Scheme + 剪贴板路径本就没有可靠回包,乐观策略避免
H5 业务卡住。

3 平台分支严格 1:1 对齐 daoqi msext:

WechatShare(对齐 WechatShareManager shareWithContent)
  - type=="2" → 截图 JPEG 0.6 + sendImageData + app icon thumb
  - else      → 链接分享 sendLinkURL + app icon thumb
  - 移除原"远端图"分支(原项目无此分支)
  - 新增 appIconImage helper(读 Info.plist CFBundleIcons,对齐
    [self getAppIconImage])

QQShare(对齐 QQShareManager shareWithContent + simpleShareToQQFriend)
  - type=="2" → 截图 → UIPasteboard.image → 4 URL Scheme fallback
  - else      → mqqapi://share/to_{fri,qzone}?req_type=1&url=...
                &title=...&description=...(webpageUrl 空时 req_type=0)
  - 不依赖 QQ SDK(CLAUDE.md ADR-006)

DouyinShare(对齐 DouyinShareManager shareWithContent)
  - type=="2" → 截图 → UIPasteboard.image → "立即打开抖音"引导框
  - else      → title+"\n\n"+desc → UIPasteboard.string → 引导框
                双侧空时兜底 "来自进贤聚友棋牌的精彩内容分享"
  - 放弃之前的"存相册 + 自动拉起"激进路径,回到原项目"用户主动点"路径

架构调整:
- SharePlatform.share 改 sync fire-and-forget(去 ShareResult 返回)
- ShareCenter.dispatch / SharePanel.show 去 completion 参数
- FriendsShareHandler:解析后先发 responseCallback("sharefriend")
  与 sharesuccess({success:"2", type:<sharefriend>}),再异步 dispatch
This commit is contained in:
joywayer
2026-06-24 07:34:03 +08:00
parent d471393806
commit 9bd5a81e6c
7 changed files with 259 additions and 219 deletions
@@ -5,16 +5,17 @@
// H5 Native handlerfriendsSharetypeUrlToptitleDescript
// docs/H5-Native-Contract.md §3.1 2 + §3.2 11sharesuccess
//
// msext gameController.m:575-597
// msext gameController.m:575-597
// 1. ShareContent
// 2. ShareCenter.dispatch
// - sharefriend == "1" SharePanel / QQ /
// - sharefriend == "2" WechatShare
// 3. bridge.call("sharesuccess", { success: "2", type: <sharefriend > })
// 2. responseCallback("sharefriend")
// 3. bridge.call("sharesuccess", { success:"2", type:<sharefriend > })
// ****H5 """" SDK
// URL Scheme /
// 4. fire-and-forget ShareCenter.dispatch UI
//
// SDK
// - Phase 4.E SDK WechatShare stub
// - QQ + SDK URL SchemePhase 4.C/4.D stub
// - WeChatManager 1.8.2 SDK
// - QQ + SDK URL Scheme + CLAUDE.md ADR-006
//
import Foundation
@@ -28,6 +29,7 @@ public enum FriendsShareHandler {
// cb: "sharefriend"msext 沿
// callbacksharesuccess({ success: "2", type: sharefriend })
bridge.register("friendsSharetypeUrlToptitleDescript") { [weak bridge] data, callback in
// 1. responseCallback msext "sharefriend"
callback?(.string("sharefriend"))
guard let obj = data?.asObject else { return }
@@ -39,25 +41,20 @@ public enum FriendsShareHandler {
title: obj["title"]?.asString ?? "",
desc: obj["description"]?.asString ?? ""
)
let sharefriend = content.sharefriend
await MainActor.run {
ShareCenter.dispatch(content) { result in
// success / cancelled / notInstalled / failed msext
// sharesuccessURL Scheme
switch result {
case .success, .cancelled:
bridge?.call("sharesuccess",
data: .object([
"success": .string("2"),
"type": .string(sharefriend)
]),
callback: nil)
case .notInstalled, .failed:
// sharesuccessH5 timeout fallback
break
}
}
// 2. sharesuccess
bridge?.call(
"sharesuccess",
data: .object([
"success": .string("2"),
"type": .string(content.sharefriend)
]),
callback: nil
)
// 3. fire-and-forget UI
ShareCenter.dispatch(content)
}
}
}