From 68cf7140d737126656b4038ab35c66288e7dc671 Mon Sep 17 00:00:00 2001 From: joywayer Date: Mon, 22 Jun 2026 20:14:31 +0800 Subject: [PATCH] =?UTF-8?q?Phase=206/7=20stub=EF=BC=9ASwitchOverGameData?= =?UTF-8?q?=20+=20OpenurlTitleData?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补齐 H5 桥 §3.1 [15][17]两个 stub handler,让 H5 调子游戏切换 / 弹层 入口时不再报 "no handler registered",避免业务流程卡住。完整流程留 Phase 6 / Phase 7 实施。 新增: - Source/Bridge/Handlers/SwitchOverGameHandler.swift §3.1 [17]stub cb "SwitchOverGameData"(驼峰首字母大写沿用 msext 字面) 完整实现需 AppCoordinator + SubGameViewController + SubGameDownloader (Phase 6.4 落地) - Source/Bridge/Handlers/OpenurlTitleDataHandler.swift §3.1 [15]stub cb "OpenurlTitleData" 完整实现需 OverlayViewController + window.settings polyfill + 3s 节流 (Phase 7 落地);注意契约硬约束 "title " 末尾空格已在注释提示 WebContainer.registerBridgeHandlers 接入。 至此 H5 桥 §3.1 大厅可调的全部 16 项 handler(除 backgameData / createRoom 等子游戏专属 §H 4 项)都已注册(含完整实现 / stub 两种状态), H5 启动 / 业务期任何 handler 调用都不会报 "no handler"。 BuildProject 通过 Co-Authored-By: Claude Opus 4.7 --- .../Handlers/OpenurlTitleDataHandler.swift | 28 +++++++++++++++++++ .../Handlers/SwitchOverGameHandler.swift | 26 +++++++++++++++++ .../WebView/WebContainerViewController.swift | 8 ++++-- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 ylgamehall/Source/Bridge/Handlers/OpenurlTitleDataHandler.swift create mode 100644 ylgamehall/Source/Bridge/Handlers/SwitchOverGameHandler.swift diff --git a/ylgamehall/Source/Bridge/Handlers/OpenurlTitleDataHandler.swift b/ylgamehall/Source/Bridge/Handlers/OpenurlTitleDataHandler.swift new file mode 100644 index 0000000..a5999e5 --- /dev/null +++ b/ylgamehall/Source/Bridge/Handlers/OpenurlTitleDataHandler.swift @@ -0,0 +1,28 @@ +// +// OpenurlTitleDataHandler.swift +// ylgamehall +// +// H5 → Native handler stub:OpenurlTitleData — 打开内嵌 WebView 弹层(threeView) +// 契约:docs/H5-Native-Contract.md §3.1 [15] +// +// Phase 7 完整实现需要 OverlayViewController + window.settings polyfill +// + 3 秒节流。当前为 stub(仅 cb 维持契约),让 H5 调时不报 "no handler"。 +// +// ⚠️ 注意入参 key "title " 末尾有空格(msext 历史契约硬约束),完整实现时 +// 必须 obj["title "]?.asString 而不是 obj["title"]?.asString。 +// + +import Foundation + +public enum OpenurlTitleDataHandler { + + public static func register(on bridge: any BridgeProtocol) { + // 【15】OpenurlTitleData + // 入参 url / "title "(末尾空格!) / data / orientation + // cb: "OpenurlTitleData" + // 完整实现需 push OverlayViewController + 3 秒节流(first_Time 标志) + bridge.register("OpenurlTitleData") { _, callback in + callback?(.string("OpenurlTitleData")) + } + } +} diff --git a/ylgamehall/Source/Bridge/Handlers/SwitchOverGameHandler.swift b/ylgamehall/Source/Bridge/Handlers/SwitchOverGameHandler.swift new file mode 100644 index 0000000..870b2b0 --- /dev/null +++ b/ylgamehall/Source/Bridge/Handlers/SwitchOverGameHandler.swift @@ -0,0 +1,26 @@ +// +// SwitchOverGameHandler.swift +// ylgamehall +// +// H5 → Native handler stub:SwitchOverGameData — 切换到子游戏 +// 契约:docs/H5-Native-Contract.md §3.1 [17] +// +// Phase 6.4 完整实现需要 AppCoordinator + SubGameViewController + +// SubGameDownloader(子游戏 zip 下载解压)。当前为 stub(仅 cb 维持契约), +// 让 H5 调时不报 "no handler",避免业务流程卡住。 +// + +import Foundation + +public enum SwitchOverGameHandler { + + public static func register(on bridge: any BridgeProtocol) { + // 【17】SwitchOverGameData + // 入参 type / Gamedirectory / gamedownloadurl / data + // cb: "SwitchOverGameData"(驼峰首字母大写,沿用 msext 字面) + // 完整实现需 push SubGameViewController + zip 下载解压 + 加载子游戏 H5 + bridge.register("SwitchOverGameData") { _, callback in + callback?(.string("SwitchOverGameData")) + } + } +} diff --git a/ylgamehall/Source/WebView/WebContainerViewController.swift b/ylgamehall/Source/WebView/WebContainerViewController.swift index 2ad257f..4782375 100644 --- a/ylgamehall/Source/WebView/WebContainerViewController.swift +++ b/ylgamehall/Source/WebView/WebContainerViewController.swift @@ -73,8 +73,12 @@ public final class WebContainerViewController: UIViewController { RemoteAudioHandler.register(on: bridge) // §3.1 [4][5]Phase 3.B/3.C/3.D stub // Phase 4.A 登录 + 分享 stub(Phase 4.B 微信 SDK / Phase 4.C QQ URL Scheme 后升级) - AccreditLoginHandler.register(on: bridge) // §3.1 [1]Phase 4.B 完整实现 - FriendsShareHandler.register(on: bridge) // §3.1 [2]Phase 4.B/4.C 完整实现 + AccreditLoginHandler.register(on: bridge) // §3.1 [1]Phase 4.E 完整微信 SDK + FriendsShareHandler.register(on: bridge) // §3.1 [2]Phase 4.B 完整框架(QQ/抖音 已 4.C/4.D 落地) + + // Phase 6.4 / 7 子游戏 + 弹层入口 stub(让 H5 业务期调时不报 "no handler") + SwitchOverGameHandler.register(on: bridge) // §3.1 [17]Phase 6 完整实现 + OpenurlTitleDataHandler.register(on: bridge) // §3.1 [15]Phase 7 完整实现 } // MARK: - 摇一摇支持