4.B 分享按页面 mode 拆分:大厅直发微信 3 分支 / 子游戏 SharePanel
【契约影响】docs/H5-Native-Contract.md §3.1[2]
原 msext 把 friendsSharetypeUrlToptitleDescript 同名 handler 在两个 VC
各注册一份且**行为完全不同**:
- NewRootVC.m(大厅):直发微信,3 type 分支
type==1 sendLinkURL(sharelogo 缩略图)
type==2 sendImageData(截图 40% 缩放为 thumb)
其他 NSData fromURL → sendImageData(公众号二维码场景)
- gameController.m(子游戏,活路径,早 return):
sharefriend==1 SharePanel 三选一
其他 WechatShareManager 朋友圈兜底(2 分支:截图/链接)
先前新外壳两个 VC 都注册同一份 handler 走"子游戏"逻辑,导致大厅页:
1. 强行弹 SharePanel 多一步操作
2. 丢失"远端图"分支(公众号二维码被错当链接发)
按页面 mode 拆开:
- FriendsShareHandler 加 Mode { lobby, subGame } 参数
- ShareCenter 拆 dispatchLobby(直发微信)/ dispatchSubGame(SharePanel)
- WechatShare 加 shareLobby() 实现完整 3 type 分支:
type==1 → shareLink + mediaTagName "游戏下载链接" + appIcon thumb
(原 msext 用 sharelogo.png,按用户决定 fallback 到 app icon)
type==2 → shareImage + mediaTagName "游戏截图分享" + 截图 0.4x thumb
+ messageExt = H5 description
其他 → URLSession 下载 NSData 直发 + 远端图 0.4x thumb
+ mediaTagName/messageExt 固定字面"公众号二维码分享"
- WebContainerViewController 注册 .lobby;SubGameViewController .subGame
附带修 sharefriend 默认值:之前 ?? "1"(弹面板)与原 msext nil→[intValue]
==0→朋友圈微信不一致。改成 ?? "",由 ShareCenter default 分支兜底走
朋友圈微信,与原项目完全等价。
This commit is contained in:
@@ -5,13 +5,15 @@
|
||||
// H5 → Native handler:friendsSharetypeUrlToptitleDescript — 分享
|
||||
// 契约:docs/H5-Native-Contract.md §3.1 [2] + §3.2 [11]sharesuccess
|
||||
//
|
||||
// 流程(与 msext gameController.m:575-597 等价,调用即视为成功):
|
||||
// 1. 入参解析 ShareContent
|
||||
// 2. responseCallback("sharefriend")
|
||||
// 3. 立即 bridge.call("sharesuccess", { success:"2", type:<sharefriend 原值> })
|
||||
// (**有意为之**:H5 端把"调用分享接口"等同"分享成功",无须等 SDK 回包;
|
||||
// URL Scheme / 剪贴板路径本身就无返回。)
|
||||
// 4. 异步 fire-and-forget 调用 ShareCenter.dispatch 拉起真实分享 UI
|
||||
// **页面 mode 区分**(与原 msext 两个 ViewController 各注册一份且行为不同对齐):
|
||||
// - `.lobby` 对应 NewRootVC.m:直发微信,3 type 分支(链接 / 截图 / 远端图)
|
||||
// - `.subGame` 对应 gameController.m 活路径:SharePanel 三选一 + 朋友圈兜底
|
||||
//
|
||||
// 公共流程(无论 mode):
|
||||
// 1. responseCallback("sharefriend")
|
||||
// 2. 立即 bridge.call("sharesuccess", { success:"2", type:<sharefriend 原值> })
|
||||
// (**有意为之**:调用分享接口即视为成功;URL Scheme / 剪贴板路径本就无返回)
|
||||
// 3. 按 mode 异步 fire-and-forget 拉起 UI
|
||||
//
|
||||
// 各平台 SDK 依赖:
|
||||
// - 微信:通过 WeChatManager(已接入 1.8.2 SDK)
|
||||
@@ -23,7 +25,15 @@ import Foundation
|
||||
@MainActor
|
||||
public enum FriendsShareHandler {
|
||||
|
||||
public static func register(on bridge: any BridgeProtocol) {
|
||||
/// 注册时机的页面 mode。
|
||||
public enum Mode: Sendable {
|
||||
/// 大厅页:H5 在 WebContainer 调 friendsShare 时直发微信
|
||||
case lobby
|
||||
/// 子游戏页:H5 在 SubGame 调 friendsShare 时弹 SharePanel 或朋友圈兜底
|
||||
case subGame
|
||||
}
|
||||
|
||||
public static func register(on bridge: any BridgeProtocol, mode: Mode) {
|
||||
// 【2】friendsSharetypeUrlToptitleDescript
|
||||
// 入参:sharefriend / sharetype / type / webpageUrl / title / description
|
||||
// cb: "sharefriend"(msext 字面,沿用)
|
||||
@@ -34,9 +44,10 @@ public enum FriendsShareHandler {
|
||||
|
||||
guard let obj = data?.asObject else { return }
|
||||
let content = ShareContent(
|
||||
sharefriend: obj["sharefriend"]?.asString ?? "1",
|
||||
// 缺失默认空串 → ShareCenter default 分支兜底(与原 msext [nil intValue]==0 等价)
|
||||
sharefriend: obj["sharefriend"]?.asString ?? "",
|
||||
sharetype: obj["sharetype"]?.asString ?? "",
|
||||
type: obj["type"]?.asString ?? "1",
|
||||
type: obj["type"]?.asString ?? "",
|
||||
webpageUrl: obj["webpageUrl"]?.asString ?? "",
|
||||
title: obj["title"]?.asString ?? "",
|
||||
desc: obj["description"]?.asString ?? ""
|
||||
@@ -53,8 +64,11 @@ public enum FriendsShareHandler {
|
||||
callback: nil
|
||||
)
|
||||
|
||||
// 3. fire-and-forget 拉起真实分享 UI
|
||||
ShareCenter.dispatch(content)
|
||||
// 3. fire-and-forget 拉起真实分享 UI(按页面 mode 选路径)
|
||||
switch mode {
|
||||
case .lobby: ShareCenter.dispatchLobby(content)
|
||||
case .subGame: ShareCenter.dispatchSubGame(content)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user