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:
@@ -5,16 +5,17 @@
|
||||
// H5 → Native handler:friendsSharetypeUrlToptitleDescript — 分享
|
||||
// 契约:docs/H5-Native-Contract.md §3.1 [2] + §3.2 [11]sharesuccess
|
||||
//
|
||||
// 完整流程(与 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 Scheme(Phase 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 字面,沿用)
|
||||
// 反向 callback:sharesuccess({ 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 行为:
|
||||
// 只要不是明确失败就发 sharesuccess(乐观策略,URL Scheme 无返回)
|
||||
switch result {
|
||||
case .success, .cancelled:
|
||||
bridge?.call("sharesuccess",
|
||||
data: .object([
|
||||
"success": .string("2"),
|
||||
"type": .string(sharefriend)
|
||||
]),
|
||||
callback: nil)
|
||||
case .notInstalled, .failed:
|
||||
// 不发 sharesuccess(H5 业务期 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user