// // 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. ShareCenter.dispatch: // - sharefriend == "1" → SharePanel 三选一(微信好友 / QQ / 抖音) // - sharefriend == "2" → 直接 WechatShare 朋友圈 // 3. 分享完成 → bridge.call("sharesuccess", { success: "2", type: }) // // 各平台 SDK 依赖: // - 微信:Phase 4.E 接入项目方 SDK(当前 WechatShare 是 stub) // - QQ + 抖音:不依赖 SDK,走 URL Scheme(Phase 4.C/4.D 真实落地,当前 stub) // 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 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 ?? "" ) 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 } } } } } }