Files
youle_app_ios_v2/ylgamehall/Source/Bridge/Handlers/FriendsShareHandler.swift
T
joywayer 5d4bdc2e29 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 分支兜底走
朋友圈微信,与原项目完全等价。
2026-06-24 08:19:21 +08:00

76 lines
3.2 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// FriendsShareHandler.swift
// ylgamehall
//
// H5 → Native handlerfriendsSharetypeUrlToptitleDescript — 分享
// 契约:docs/H5-Native-Contract.md §3.1 2 + §3.2 11sharesuccess
//
// **页面 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
// - QQ + 抖音:不依赖 SDK,走 URL Scheme + 剪贴板(CLAUDE.md ADR-006
//
import Foundation
@MainActor
public enum FriendsShareHandler {
/// 注册时机的页面 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 字面,沿用)
// 反向 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 }
let content = ShareContent(
// 缺失默认空串 → ShareCenter default 分支兜底(与原 msext [nil intValue]==0 等价)
sharefriend: obj["sharefriend"]?.asString ?? "",
sharetype: obj["sharetype"]?.asString ?? "",
type: obj["type"]?.asString ?? "",
webpageUrl: obj["webpageUrl"]?.asString ?? "",
title: obj["title"]?.asString ?? "",
desc: obj["description"]?.asString ?? ""
)
await MainActor.run {
// 2. 立即触发 sharesuccess —— 有意为之:调用即视为成功
bridge?.call(
"sharesuccess",
data: .object([
"success": .string("2"),
"type": .string(content.sharefriend)
]),
callback: nil
)
// 3. fire-and-forget 拉起真实分享 UI(按页面 mode 选路径)
switch mode {
case .lobby: ShareCenter.dispatchLobby(content)
case .subGame: ShareCenter.dispatchSubGame(content)
}
}
}
}
}