Phase 6 commit A:AppCoordinator + SubGameViewController 框架 + SwitchOverGameData push

- AppCoordinator:2s 节流 + 栈深 < 2 守门 + .subGameDidReturn 通知名(Design §2.4.3)
- SubGameViewController:复用 BridgedWebView/Splash/16:9 letterbox/ExternalSubscriptions,
  AppDataWriter(.subGame) 写 4 个 app_*.js;H5 未安装时抛错(待 commit B 接入下载)
- SwitchOverGameHandler:解 Gamedirectory/gamedownloadurl/data → AppCoordinator.showSubGame
  (msext NewRootVC.m:541-566 等价,节流与栈深由 Coordinator 守门,cb 字面始终回)
- SceneDelegate:UINavigationController 承载大厅,nav 引用交给 AppCoordinator
- Plan 进度已勾选 §5 / §8(commit B/C 留待 SubGameDownloader 与 backgameData/getWebdata 链路)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-22 20:59:00 +08:00
co-authored by Claude Opus 4.7
parent 68cf7140d7
commit 7a5644053d
5 changed files with 471 additions and 15 deletions
@@ -2,12 +2,19 @@
// SwitchOverGameHandler.swift
// ylgamehall
//
// H5 Native handler stubSwitchOverGameData
// H5 Native handlerSwitchOverGameData
// docs/H5-Native-Contract.md §3.1 17
//
// Phase 6.4 AppCoordinator + SubGameViewController +
// SubGameDownloader zip stub cb
// H5 "no handler"
// 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" H5commit C .subGameDidReturn callback getWebdata
//
import Foundation
@@ -18,8 +25,23 @@ public enum SwitchOverGameHandler {
// 17SwitchOverGameData
// type / Gamedirectory / gamedownloadurl / data
// cb: "SwitchOverGameData"沿 msext
// push SubGameViewController + zip + H5
bridge.register("SwitchOverGameData") { _, callback in
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"))
}
}