// // SwitchOverGameHandler.swift // ylgamehall // // H5 → Native handler:SwitchOverGameData — 切换到子游戏。 // 契约:docs/H5-Native-Contract.md §3.1 [17] // // 与 msext NewRootVC.m:541-566 等价: // - 解析 Gamedirectory / gamedownloadurl / data // - 2s 节流(msext one_Time / canbackone;本项目挪到 AppCoordinator.showSubGame) // - 调 AppCoordinator.shared.showSubGame(...) push 子游戏 VC // - 无论 push 是否成功,都回 callback "SwitchOverGameData"(msext 行为) // // ⚠️ 入参字段名严格保持字面: // - "Gamedirectory" G 大写 // - "gamedownloadurl" 全小写 // - "data" 透传给子游戏 H5(commit C 通过 .subGameDidReturn 反向 callback getWebdata) // import Foundation public enum SwitchOverGameHandler { public static func register(on bridge: any BridgeProtocol) { // 【17】SwitchOverGameData // 入参 type / Gamedirectory / gamedownloadurl / data // cb: "SwitchOverGameData"(驼峰首字母大写,沿用 msext 字面) bridge.register("SwitchOverGameData") { data, callback in await MainActor.run { let dir = data?["Gamedirectory"]?.asString ?? "" let url = data?["gamedownloadurl"]?.asString ?? "" let web = data?["data"]?.asString ?? "" // msext 行为:gameStart 沿用 Gamedirectory(同名同目录), // 后续若契约出现独立 gamestart 字段再扩展。 let request = SubGameRequest( gameDir: dir, gameStart: dir, downloadURL: url, webData: web ) AppCoordinator.shared.showSubGame(request) } // 与 msext 一致:节流命中 / 入参缺失也回 cb,避免 H5 业务期等待 callback?(.string("SwitchOverGameData")) } } }