From c77037f407bc92e3cbe5a05709c5bd6ef6164848 Mon Sep 17 00:00:00 2001 From: joywayer Date: Mon, 22 Jun 2026 21:19:55 +0800 Subject: [PATCH] =?UTF-8?q?Phase=208=20=E8=A7=86=E9=A2=91=E6=88=BF?= =?UTF-8?q?=E9=97=B4=203=20=E4=BB=B6=E5=A5=97=20stub=EF=BC=9AcreateRoom=20?= =?UTF-8?q?/=20getVideoinfo=20/=20exitRoom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 业务暂未启用视频功能,按运营确认仅维持桥契约,让 H5 子游戏调用不报 "no handler"。 - 新增 Source/Bridge/Handlers/VideoRoomHandlers.swift:单一 enum.register 3 个 stub, 各自 callback 字面回包名(与 OpenSaomaHandler 同款 stub 模式) - SubGameViewController.registerBridgeHandlers 挂上 VideoRoomHandlers - 不抽 VideoRoom protocol / NoopVideoRoom 类(违反"不为假设的未来需求设计"原则); 未来重新接入 Agora 时把 3 个 stub 展开实现即可,注册点不变 - Plan §5.6.3 / §5.8.1-8.3 进度已勾选 Co-Authored-By: Claude Opus 4.7 --- docs/Development-Plan.md | 10 +++-- .../Bridge/Handlers/VideoRoomHandlers.swift | 45 +++++++++++++++++++ .../WebView/SubGameViewController.swift | 4 +- 3 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 ylgamehall/Source/Bridge/Handlers/VideoRoomHandlers.swift 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: - 摇一摇支持