// // FriendsShareHandler.swift // ylgamehall // // 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: }) // (**有意为之**:H5 端把"调用分享接口"等同"分享成功",无须等 SDK 回包; // URL Scheme / 剪贴板路径本身就无返回。) // 4. 异步 fire-and-forget 调用 ShareCenter.dispatch 拉起真实分享 UI // // 各平台 SDK 依赖: // - 微信:通过 WeChatManager(已接入 1.8.2 SDK) // - QQ + 抖音:不依赖 SDK,走 URL Scheme + 剪贴板(CLAUDE.md ADR-006) // import Foundation @MainActor public enum FriendsShareHandler { public static func register(on bridge: any BridgeProtocol) { // 【2】friendsSharetypeUrlToptitleDescript // 入参:sharefriend / sharetype / type / webpageUrl / title / description // 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 } let content = ShareContent( sharefriend: obj["sharefriend"]?.asString ?? "1", sharetype: obj["sharetype"]?.asString ?? "", type: obj["type"]?.asString ?? "1", 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 ShareCenter.dispatch(content) } } } }