Files
youle_app_ios_v2/ylgamehall/Source/Bridge/Handlers/BackGameDataHandler.swift
T
joywayerandClaude Opus 4.7 05f1396645 微信 SDK 降级 2.0.5 → 1.8.2(与 daoqi msext 同款,避开 UL 强制)
H5 调 accreditlogin 后 sendAuthReq success=false,根因:微信 OpenSDK
2.0.x 强制 Universal Link,传空串被 SDK 拒绝;daoqi msext 用 1.8.x 不强制
UL,多年稳定上线。沿用 1.8.2 避免无谓的 UL 运维负担(HTTPS 域名 + AASA +
微信开放平台审核 30min-1d)。

文件改动:
- 新增 Vendor/WechatSDK/v1.8.2/{WXApi,WXApiObject,WechatAuthSDK}.h +
  libWeChatSDK.a(16MB,fat: i386+armv7+armv7s+x86_64+arm64,从 daoqi
  msext/Class/SDKExport/ 直接拷贝)
- 删除 Vendor/WechatSDK/WechatOpenSDK-NoPay.xcframework(2.0.5)
- 新增 ylgamehall/ylgamehall-Bridging-Header.h(1.x .a 无 Swift module,
  必须通过 Bridging Header 导入 WXApi.h / WXApiObject.h)

代码侧(5 个 Swift 文件):
- WeChatSDK.swift:register() 改为 1.x 单参数 WXApi.registerApp(appID),
  去掉 universalLink 参数;handleOpenURL 不变(1.x/2.x 同款)
- WeChatManager.swift:去掉 #if canImport(WechatOpenSDK) 守卫(Bridging
  Header 直接导入,符号编译期必在);authorize sendAuthReq 改 1.x BOOL
  返回(无 completion);shareLink/shareImage 改 WXApi.sendReq(req)
  (1.x BOOL 返回,无 completion);getVersion → getApiVersion
- AccreditLoginHandler / WechatShare:同样去掉 canImport 守卫和 stub 分支
- BackGameDataHandler:更新注释说明 1.x WXApi delegate 由 sendAuthReq
  逐次传入,WeChatManager singleton 持有不需要清理(1.x 早期 setDelegate:
  API 已废弃)

文档:
- Vendor/WechatSDK/README.md 重写,说明 1.8.2 决策原因 + 文件结构 +
  Xcode 接入 5 步 + M Mac simulator 已知限制
- docs/SDK-Integration-Guide.md §A.1 同步重写

⚠️ **本 commit 后 BuildProject 会失败**,需要用户在 Xcode UI 完成 5 步:
1. 删 Frameworks 里旧 WechatOpenSDK-NoPay.xcframework 引用
2. Add Vendor/WechatSDK/v1.8.2/libWeChatSDK.a(Do Not Embed)
3. Add 4 个系统库:libz.tbd / libsqlite3.tbd / Security.framework /
   CFNetwork.framework(Do Not Embed)
4. Build Settings → Header Search Paths += $(PROJECT_DIR)/Vendor/WechatSDK/v1.8.2
5. Build Settings → Objective-C Bridging Header = ylgamehall/ylgamehall-Bridging-Header.h

详细操作步骤见 Vendor/WechatSDK/README.md「Xcode 接入步骤」。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-23 08:27:40 +08:00

84 lines
4.5 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.
//
// BackGameDataHandler.swift
// ylgamehall
//
// H5 → Native handlerbackgameData — 子游戏退出并把数据回传给大厅。
// 契约:docs/H5-Native-Contract.md §3.1 18
//
// 与 msext gameController.m:691-709 等价:
// 1) 停背景音(无条件,与 stopBackground 不同 — msext 不看 type 直接 nil
// 2) AppCoordinator.shared.popSubGame(returningData: data)
// 内部 popViewController + 发 .subGameDidReturn 通知,由大厅监听后
// 回调 H5 `getWebdata` 完成反向闭环
// 3) responseCallback("backgameData") 无论 data 是否解析成功都回(msext 字面)
//
// ⚠️ 仅注册到子游戏 SubGameViewController;大厅 WebContainerViewController 不注册。
// H5 大厅页若误调 backgameData 会落空(bridge 无对应 handler → JS 端的 callback 直接卡),
// msext 同款行为 — 这是契约边界,不在原生侧兜底。
//
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// SDK 清理钩子状态(每接入新 SDK 都必须确认或新增):
//
// ✅ Phase 4.E 微信:新版 SDK2.x)无 static delegate API,逐次调用 handleOpenURL/sendAuthReq
// 时传入并被 SDK 弱引用;WeChatManager singleton 长生命周期,子游戏 pop 不析构,无需清理
// ✅ Phase 5 高德定位:`LocationService.shared.stop()`(已加,canImport 守卫,
// Xcode Embed AMapLocationKit 后激活)
// ⏳ Phase 3.B/C/D 录音 / 七牛上传:`AudioRecorder.shared.cancel()` 待 opencore-amr
// 接入后取消注释;`QiniuUploader.cancelInFlight()` 依赖 Task.cancel 传播无需显式调
// ⏳ Phase 8 Agora(若未来重启视频):`agoraKit.leaveChannel(...)`
// (目前 VideoRoomHandlers 是 stub 无需清理)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//
import Foundation
public enum BackGameDataHandler {
public static func register(on bridge: any BridgeProtocol) {
// 【18】backgameData
// 入参 data(字符串,子游戏 H5 自定义透传给大厅 getWebdata
// cb: "backgameData"
bridge.register("backgameData") { data, callback in
await MainActor.run {
// data 可能是 string / object,统一序列化为 stringmsext NSString 透传等价)。
// - 直接是 .string → 取字面
// - 其它类型 → JSON 序列化(保留对象结构传给大厅 H5)
let payload = serialize(data)
// 子游戏 push 期间挂载的 SDK 资源在 pop 前显式清理(避免 delegate 悬挂 /
// 后台任务残留),与 msext gameController.m:691-709 + cleanUpAction 等价。
AudioPlayer.shared.stopAllBackground()
// 微信 SDK 1.8.2 delegate 通过 sendAuthReq:viewController:delegate: 或
// handleOpenURL:delegate: 逐次调用时传入并被 SDK 弱引用。WeChatManager
// 作为 shared singleton 长生命周期持有,子游戏 pop 不会让它析构,无悬挂回调风险。
// msext gameController.m:699 的 [WXApi setDelegate:nil] 是 1.x 早期 API
// 1.8.x 之后已废弃,不需要清理。
#if canImport(AMapLocationKit)
// msext gameController.m:2473-2478 cleanUpAction 等价
LocationService.shared.stop()
#endif
// Phase 3.C 录音 / Phase 3.B 七牛上传 清理(QiniuUploader.cancelInFlight 当前
// 依赖 Task.cancel 传播;AudioRecorder 待 opencore-amr 接入后激活清理)
// AudioRecorder.shared.cancel() // ← Phase 3.C 接入时取消注释
AppCoordinator.shared.popSubGame(returningData: payload)
}
callback?(.string("backgameData"))
}
}
private static func serialize(_ data: BridgeData?) -> String {
if let s = data?.asString { return s }
guard let data else { return "" }
let any = data.jsonObject
if let bytes = try? JSONSerialization.data(withJSONObject: any, options: [.fragmentsAllowed]),
let s = String(data: bytes, encoding: .utf8) {
return s
}
return ""
}
}