Phase 1.3:SandboxPaths 统一沙盒 / Bundle / H5 路径入口

集中管理 NSSearchPathFor... 调用,避免散落,方便后续 ResourceUnzipper
(Phase 1.5)与 WebView 加载(Phase 1.10)复用。

- 新增 ylgamehall/Source/Resource/SandboxPaths.swift
  - 基础:caches / documents / bundle
  - 大厅 H5:lobbyRoot / lobbyIndex / lobbyVersionXML(基于 BundleConfig
    当前渠道值动态拼接)
  - 子游戏 H5:subGameRoot(_:) / subGameIndex(_:_:)(Phase 6 调用,
    入参传 SwitchOverGameData 解出的 dir/start)
  - 全部 enum + static,无状态,Swift 6 严格并发零负担
- RootViewController.viewDidLoad 补 SandboxPaths 烟雾打印 6 项路径,
  便于首次启动 console 校验:
  - lobbyIndex 应为 {Caches}/FtJf073.../gamehall/index.html
  - lobbyVersionXML 应为 {Caches}/FtJf073.../gamehall/version.xml
- BuildProject 通过,synchronized group 自动收编新文件
This commit is contained in:
joywayer
2026-06-21 23:52:23 +08:00
parent dcc12bb76d
commit 730574a2e2
2 changed files with 82 additions and 0 deletions
+11
View File
@@ -29,6 +29,17 @@ final class RootViewController: UIViewController {
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)
""")
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
@@ -0,0 +1,71 @@
//
// SandboxPaths.swift
// ylgamehall
//
// Bundle NSSearchPathFor...
// docs/H5-Native-Implementation-Design.md §7.1
//
import Foundation
/// BundleH5 ResourceUnzipper / WebView
/// `urls(for:in:)`
public enum SandboxPaths {
// MARK: -
/// `Library/Caches/`
public static var caches: URL {
FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0]
}
/// `Documents/`iCloud
public static var documents: URL {
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
}
/// `<App>.app/`
public static var bundle: URL {
Bundle.main.bundleURL
}
// MARK: - H5 BundleConfig.shared
/// H5 `{Caches}/{gamedir}/`
public static var lobbyRoot: URL {
caches.appendingPathComponent(BundleConfig.shared.gameDir)
}
/// H5 HTML`{Caches}/{gamedir}/{gamestart}/index.html`
public static var lobbyIndex: URL {
let cfg = BundleConfig.shared
return caches
.appendingPathComponent(cfg.gameDir)
.appendingPathComponent(cfg.gameStart)
.appendingPathComponent("index.html")
}
/// H5 `{Caches}/{gamedir}/{gamestart}/version.xml`
/// ResourceUnzipper gamehall.zip
public static var lobbyVersionXML: URL {
let cfg = BundleConfig.shared
return caches
.appendingPathComponent(cfg.gameDir)
.appendingPathComponent(cfg.gameStart)
.appendingPathComponent("version.xml")
}
// MARK: - H5 SwitchOverGameData
/// H5 `{Caches}/{dir}/`
public static func subGameRoot(_ dir: String) -> URL {
caches.appendingPathComponent(dir)
}
/// H5 HTML`{Caches}/{dir}/{start}/index.html`
public static func subGameIndex(_ dir: String, _ start: String) -> URL {
caches.appendingPathComponent(dir)
.appendingPathComponent(start)
.appendingPathComponent("index.html")
}
}