// // RootViewController.swift // ylgamehall // // M0 阶段临时根控制器,后续将被 Coordinator + LobbyViewController 替换。 // import UIKit final class RootViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .black // Phase 1.2 烟雾测试:打印 ChannelConfig.plist 的 11 项渠道注入值 let cfg = BundleConfig.shared print(""" [BundleConfig] 渠道注入读取结果: qiniuDomain = \(cfg.qiniuDomain) gameId = \(cfg.gameId) channel = \(cfg.channel) gameDir = \(cfg.gameDir) gameStart = \(cfg.gameStart) gameConfig = \(cfg.gameConfig) market = \(cfg.market) agent = \(cfg.agent) appVersion = \(cfg.appVersion) other = "\(cfg.other)" appleConfig = "\(cfg.appleConfig)" """) // Phase 1.3 烟雾测试:打印 SandboxPaths 计算路径 print(""" [SandboxPaths] 路径计算结果: caches = \(SandboxPaths.caches.path) documents = \(SandboxPaths.documents.path) bundle = \(SandboxPaths.bundle.path) lobbyRoot = \(SandboxPaths.lobbyRoot.path) lobbyIndex = \(SandboxPaths.lobbyIndex.path) lobbyVersionXML = \(SandboxPaths.lobbyVersionXML.path) """) // Phase 1.5 烟雾测试:触发 ResourceUnzipper,确认 lobby index.html 存在 Task { let start = Date() do { try await ResourceUnzipper.shared.ensureReady() let elapsed = Date().timeIntervalSince(start) let exists = FileManager.default.fileExists(atPath: SandboxPaths.lobbyIndex.path) print(""" [ResourceUnzipper] ensureReady 完成(耗时 \(String(format: "%.3f", elapsed))s) lobbyIndex 存在: \(exists) """) } catch { print("[ResourceUnzipper] ERROR: \(error)") } } // Phase 1.8 烟雾测试:确认 WebViewJavascriptBridge.js 已入 Bundle 且可读 // 注:synchronized group 会把 ylgamehall/Resources/JS/ 子目录扁平化为 bundle 根, // 所以无需 subdirectory 参数。 if let url = Bundle.main.url(forResource: "WebViewJavascriptBridge", withExtension: "js"), let content = try? String(contentsOf: url, encoding: .utf8) { print(""" [WVJB.js] 已就绪 path = \(url.path) bytes = \(content.utf8.count) head = \(content.prefix(60).replacingOccurrences(of: "\n", with: " ⏎ "))… """) } else { print("[WVJB.js] ERROR: 找不到 Bundle 内 JS/WebViewJavascriptBridge.js") } // Phase 1.10 烟雾测试:拉远端渠道配置 .txt(含 cache-busting + 短文本响应识别) Task { let start = Date() do { let outcome = try await RemoteConfigClient.shared.fetch() let elapsed = Date().timeIntervalSince(start) switch outcome { case .parsed(let cfg): print(""" [RemoteConfigClient] 拉取成功 .parsed(耗时 \(String(format: "%.3f", elapsed))s) showmessage = \(cfg.showmessage ?? "") agentlist count = \(cfg.agentlist?.count ?? 0) """) if let first = cfg.agentlist?.first { print(""" agent[0].agentid = \(first.agentid ?? "") agent[0].appVersion = \(first.appVersion ?? "") agent[0].gameVersion = \(first.gameVersion ?? "") agent[0].channellist = \(first.channellist?.count ?? 0) 个 agent[0].gamelist = \(first.gamelist?.count ?? 0) 个 """) } // Phase 1.11 烟雾测试:chulishengji 双子树合并 let bc = BundleConfig.shared let resolved = VersionResolver.resolve( config: cfg, agentId: bc.agent, channelId: bc.channel, marketId: bc.market, gameId: bc.gameId ) print(""" [VersionResolver] chulishengji 双子树合并结果: appVersion = \(resolved.appVersion) appDownload = \(resolved.appDownload ?? "") gameVersion = \(resolved.gameVersion) gameZip = \(resolved.gameZip ?? "") showmessage = "\(resolved.showmessage ?? "")" """) // Phase 1.12 烟雾测试:读本地版本号 + 与远端对比 let localApp = LocalVersionReader.localAppVersion let localGame = LocalVersionReader.localGameVersion let needIPAUpgrade = resolved.appVersion > localApp let needZipUpgrade = resolved.gameVersion > localGame print(""" [LocalVersionReader] 本地 vs 远端对比: 本地 appVersion = \(localApp)(来自 ChannelConfig.plist) 远端 appVersion = \(resolved.appVersion) → IPA 升级 = \(needIPAUpgrade ? "需要" : "不需要") 本地 gameVersion = \(localGame)(来自 version.xml /game/version@value) 远端 gameVersion = \(resolved.gameVersion) → H5 zip 升级 = \(needZipUpgrade ? "需要" : "不需要") """) case .shortText(let msg): print(""" [RemoteConfigClient] 拉到短文本响应(耗时 \(String(format: "%.3f", elapsed))s) 运营杀手锏:应当弹窗显示并停止重试 内容 = "\(msg)" """) } } catch { print("[RemoteConfigClient] ERROR: \(error)") } } } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .landscape } override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { .landscapeRight } override var prefersStatusBarHidden: Bool { false } }