diff --git a/docs/Development-Plan.md b/docs/Development-Plan.md index 27adad0..9bb6c13 100644 --- a/docs/Development-Plan.md +++ b/docs/Development-Plan.md @@ -592,7 +592,9 @@ Contract Design Plan(本文档) - [x] **6.3** 子游戏 handler 注册(拆散到独立 enum,不抽 `SubGameHandlers` 聚合类): - 14 个与大厅共享 handler 直接复用各自 enum.register - 新增 `Source/Bridge/Handlers/BackGameDataHandler.swift`,仅 SubGameViewController 注册 - - exitRoom / getVideoinfo / createRoom 等视频房间 handler 留待 Phase 8 + - 新增 `Source/Bridge/Handlers/VideoRoomHandlers.swift` stub(createRoom / getVideoinfo / exitRoom): + 业务暂未启用视频功能,仅维持桥契约不让 H5 报 "no handler"; + 未来接 Agora 时把 3 个 stub 展开实现,注册点不变 - [x] **6.4** `SwitchOverGameData` handler(大厅 + 子游戏共用):解参 `Gamedirectory` / `gamedownloadurl` / `data` → `AppCoordinator.shared.showSubGame(...)`;节流 / 栈深守门移到 Coordinator,handler 始终回 cb `"SwitchOverGameData"`(msext NewRootVC.m:541-566 等价) - [x] **SceneDelegate**:以 `UINavigationController` 承载大厅,`AppCoordinator.shared.navigationController` 持引;导航栏隐藏 + 禁用边缘 pop 手势 - [x] **6.5** `backgameData` handler(仅子游戏 `BackGameDataHandler.swift` 注册): @@ -661,9 +663,9 @@ H5 调 `OpenurlTitleData` 打开弹层 WebView,弹层内 H5 用 `window.settin #### 任务清单 -- [ ] **8.1** `Source/VideoRoom/VideoRoom.swift` 协议 -- [ ] **8.2** `Source/VideoRoom/NoopVideoRoom.swift` 实现(log + 不动) -- [ ] **8.3** `SubGameHandlers` 注入 NoopVideoRoom,注册: +- [x] **8.1/8.2/8.3** 视频房间 3 件套 stub 已在 Phase 6 commit C 同期落地: + - `Source/Bridge/Handlers/VideoRoomHandlers.swift` 直接 enum.register(不抽 protocol/Noop 类, + 业务暂未启用 Agora,未来接入时把 3 个 stub 展开即可,注册点不变) - `createRoom` stub → `cb("createRoom")` - `getVideoinfo` stub → `cb("getVideoinfo")` - `exitRoom` stub → `cb("exitRoom")` diff --git a/ylgamehall/Source/Bridge/Handlers/VideoRoomHandlers.swift b/ylgamehall/Source/Bridge/Handlers/VideoRoomHandlers.swift new file mode 100644 index 0000000..bf69dd8 --- /dev/null +++ b/ylgamehall/Source/Bridge/Handlers/VideoRoomHandlers.swift @@ -0,0 +1,45 @@ +// +// VideoRoomHandlers.swift +// ylgamehall +// +// H5 → Native handler stub:声网视频房间 3 件套(createRoom / getVideoinfo / exitRoom)。 +// 契约:docs/H5-Native-Contract.md §3.1 [19][20][21] +// +// 当前业务不使用视频功能(运营确认下线 / 暂未启用),此处仅注册空 handler 维持 +// 桥契约:H5 子游戏页若误调不会触发 "bridge handler not found" 错误分支。 +// 当未来重新接入 Agora 时(Phase 8 完整实现),把每个 handler 的实现展开即可, +// 注册位点不变。 +// +// 注:契约 §3.2 [13]的 Native → H5 反向 `getVideoinfo(uid 字符串)` 在 Agora SDK +// didDecodedRemoteVideo 时由 SDK 适配层触发,与本文件 stub 无关。 +// +// ⚠️ 仅注册到 SubGameViewController;大厅 WebContainerViewController 不注册 +// (msext NewRootVC 也不注册,沿用 msext 行为)。 +// + +import Foundation + +public enum VideoRoomHandlers { + + public static func register(on bridge: any BridgeProtocol) { + // 【19】createRoom — 创建/加入音视频房间 + // 入参:pmw / pmh / top / left / width / height / playerid / roomid + // 完整实现:md5(agentinfo+gameinfo+roomid) 算频道名 + Agora joinChannel + 本地画像 + bridge.register("createRoom") { _, callback in + callback?(.string("createRoom")) + } + + // 【20】getVideoinfo(H5→Native 方向)— 添加/排版远端视频窗 + // 入参与 createRoom 几乎相同,缺 roomid(已在房间内) + // 完整实现:Agora setupRemoteVideo + 把 view 放到 H5 指定坐标 + bridge.register("getVideoinfo") { _, callback in + callback?(.string("getVideoinfo")) + } + + // 【21】exitRoom — 离开房间 + // 完整实现:Agora leaveChannel + 清理本地/远端 view + bridge.register("exitRoom") { _, callback in + callback?(.string("exitRoom")) + } + } +} diff --git a/ylgamehall/Source/WebView/SubGameViewController.swift b/ylgamehall/Source/WebView/SubGameViewController.swift index 0e340d9..5b3f79b 100644 --- a/ylgamehall/Source/WebView/SubGameViewController.swift +++ b/ylgamehall/Source/WebView/SubGameViewController.swift @@ -86,7 +86,9 @@ public final class SubGameViewController: UIViewController { // 子游戏专属:backgameData(退出回大厅 + 反向 callback getWebdata) BackGameDataHandler.register(on: bridge) - // exitRoom / getVideoinfo / createRoom 等视频房间 handler 留待 Phase 8 接入 + // 视频房间 3 件套 stub(业务暂未启用,仅维持桥契约不让 H5 报 "no handler") + // 未来接 Agora 时把 VideoRoomHandlers 内 3 个 stub 展开实现,注册点不变。 + VideoRoomHandlers.register(on: bridge) } // MARK: - 摇一摇支持