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:
joywayer
2026-06-24 08:19:21 +08:00
parent 68c668a06c
commit 5d4bdc2e29
5 changed files with 125 additions and 28 deletions
@@ -5,13 +5,15 @@
// H5 Native handlerfriendsSharetypeUrlToptitleDescript
// docs/H5-Native-Contract.md §3.1 2 + §3.2 11sharesuccess
//
// 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.m3 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) {
// 2friendsSharetypeUrlToptitleDescript
// 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)
}
}
}
}
+21 -9
View File
@@ -2,9 +2,17 @@
// ShareCenter.swift
// ylgamehall
//
// H5 friendsShare msext gameController.m:575-597
// - sharefriend == "1"/ SharePanel /QQ/
// - sharefriend == "2" WechatShare timeline
// H5 friendsShare msext handler
// ViewController **** mode
//
// dispatchSubGame msext gameController.m:575-597
// - sharefriend == "1" SharePanel /QQ/
// - WechatShare.share() timeline
//
// dispatchLobby msext NewRootVC.m:453-537 SharePanel
// - sharefriend == "1" WXSceneSession
// - WXSceneTimeline
// - type 3 WechatShare.shareLobby
//
// fire-and-forgetH5 sharesuccess FriendsShareHandler
// UI / SDK
@@ -15,19 +23,23 @@ import Foundation
@MainActor
public enum ShareCenter {
public static func dispatch(_ content: ShareContent) {
/// SubGameViewControllerSharePanel +
public static func dispatchSubGame(_ content: ShareContent) {
switch content.sharefriend {
case "1":
// / SharePanel
SharePanel.show(content: content)
case "2":
// WechatSharetimeline
WechatShare.shared.share(content, scene: .timeline)
default:
// sharefriendmsext 沿
// sharefriend == "2" msext WechatShareManager
// [sharefriend intValue] != 1 WXSceneTimeline
WechatShare.shared.share(content, scene: .timeline)
}
}
/// WebContainerViewController SharePanel
public static func dispatchLobby(_ content: ShareContent) {
let scene: ShareScene = content.sharefriend == "1" ? .friend : .timeline
WechatShare.shared.shareLobby(content, scene: scene)
}
}
+76 -5
View File
@@ -2,12 +2,20 @@
// WechatShare.swift
// ylgamehall
//
// SharePlatform 1:1 daoqi msext WechatShareManager
// `shareWithContent:completion:`
// - type == "2" getImageWithFullScreenshot + JPEG 0.6 + sendImageData
// - else sendLinkURL + webpageUrl + title + desc
// SharePlatform + shareLobby()
//
// app icon `[self getAppIconImage]` sharelogo
// msext ViewController handler
//
// share() daoqi msext `WechatShareManager.shareWithContent:`
// gameController.m 2 type
// - type == "2" thumb = app icon
// - else thumb = app icon
//
// shareLobby() daoqi msext `NewRootVC.m:471-534` 3 type
// - type == "1" thumb = app icon msext
// sharelogo.png fallback app icon
// - type == "2" thumb = 40%
// - NSData + thumb = 40%
//
// fire-and-forgetH5 sharesuccess FriendsShareHandler
// dispatch_after 1s completion(YES)
@@ -69,6 +77,69 @@ public final class WechatShare: SharePlatform {
}
}
// MARK: - NewRootVC.m
/// H5 friendsShare msext NewRootVC.m
/// :471-534 3 SharePanel
public func shareLobby(_ content: ShareContent, scene: ShareScene) {
guard WXApi.isWXAppInstalled() else { return }
let wxScene: WeChatManager.ShareScene = (scene == .timeline) ? .timeline : .session
let appIcon = Self.appIconImage()
Task { @MainActor in
do {
switch content.type {
case "1":
// msext sharelogo.png fallback app icon
try await WeChatManager.shared.shareLink(
.init(
url: content.webpageUrl,
title: content.title,
desc: content.desc,
thumb: appIcon,
mediaTagName: "\(Self.appTagPrefix)游戏下载链接"
),
scene: wxScene
)
case "2":
// thumb = 40% msext imageByScalingAndCroppingForSize:0.4x
let shot = try ImageProvider.captureScreenshot()
guard let imageData = shot.jpegData(compressionQuality: 0.6) else { return }
try await WeChatManager.shared.shareImage(
.init(
imageData: imageData,
thumb: ImageProvider.scaledThumb(shot, scale: 0.4),
messageExt: content.desc,
mediaTagName: "\(Self.appTagPrefix)游戏截图分享"
),
scene: wxScene
)
default:
// type == "" / "3" / NSData +
// thumb = 40% messageExt/mediaTagName
// msext NewRootVC.m:530 H5 desc
guard let url = URL(string: content.webpageUrl) else { return }
let (data, _) = try await URLSession.shared.data(from: url)
guard let image = UIImage(data: data) else { return }
try await WeChatManager.shared.shareImage(
.init(
imageData: data,
thumb: ImageProvider.scaledThumb(image, scale: 0.4),
messageExt: "\(Self.appTagPrefix)公众号二维码分享",
mediaTagName: "\(Self.appTagPrefix)公众号二维码分享"
),
scene: wxScene
)
}
} catch {
// sharesuccess
}
}
}
// MARK: - /
/// msext WechatShareManager "" daoqi
/// SGDefineInfo.h gamehallname WXMediaMessage.mediaTagName
private static let appTagPrefix = "进贤聚友棋牌"
@@ -112,7 +112,7 @@ public final class SubGameViewController: UIViewController {
)
AccreditLoginHandler.register(on: bridge)
FriendsShareHandler.register(on: bridge)
FriendsShareHandler.register(on: bridge, mode: .subGame) // SharePanel + msext gameController.m
// OpenurlTitleData threeView push stub
OpenurlTitleDataHandler.register(on: bridge)
@@ -95,7 +95,7 @@ public final class WebContainerViewController: UIViewController {
// Phase 4.A + stubPhase 4.B SDK / Phase 4.C QQ URL Scheme
AccreditLoginHandler.register(on: bridge) // §3.1 1Phase 4.E SDK
FriendsShareHandler.register(on: bridge) // §3.1 2Phase 4.B QQ/ 4.C/4.D
FriendsShareHandler.register(on: bridge, mode: .lobby) // §3.1 23 type msext NewRootVC.m
// Phase 6.4 / 7 + stub H5 "no handler"
SwitchOverGameHandler.register(on: bridge) // §3.1 17Phase 6