Introduce APIClient/AuthAPI, complete login with multi-account selection, and polish the login card UI with shadow and keyboard dismiss. Co-authored-by: Cursor <cursoragent@cursor.com>
61 lines
1.8 KiB
Swift
61 lines
1.8 KiB
Swift
//
|
||
// APIEnvironment.swift
|
||
// suixinkan
|
||
//
|
||
|
||
import Foundation
|
||
|
||
/// 网络环境实体,集中描述 HTTP 和 WebSocket 的服务地址。
|
||
struct APIEnvironment: Equatable {
|
||
let baseURL: URL
|
||
let webSocketURL: URL
|
||
|
||
nonisolated static let production = APIEnvironment(
|
||
baseURL: URL(string: "https://api.zhifly.cn")!,
|
||
webSocketURL: URL(string: "wss://api.zhifly.cn/wss")!
|
||
)
|
||
|
||
nonisolated static let testing = APIEnvironment(
|
||
baseURL: URL(string: "https://api-test.zhifly.cn")!,
|
||
webSocketURL: URL(string: "wss://api-test.zhifly.cn/wss")!
|
||
)
|
||
|
||
nonisolated static var current: APIEnvironment {
|
||
#if DEBUG
|
||
.testing
|
||
#else
|
||
.production
|
||
#endif
|
||
}
|
||
}
|
||
|
||
/// 客户端信息工具,负责提供网络请求所需的 App 版本和系统类型。
|
||
enum AppClientInfo {
|
||
nonisolated static let osType = "iOS"
|
||
|
||
/// 生成后端要求的 App 版本号,版本号不足三段时用 build 号补齐。
|
||
nonisolated static func appVersion(infoDictionary: [String: Any]? = Bundle.main.infoDictionary) -> String {
|
||
let version = (infoDictionary?["CFBundleShortVersionString"] as? String)?
|
||
.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
.nonEmpty ?? "1.0.0"
|
||
let build = (infoDictionary?["CFBundleVersion"] as? String)?
|
||
.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
.nonEmpty
|
||
let versionParts = version.split(separator: ".", omittingEmptySubsequences: false)
|
||
|
||
if versionParts.count >= 3 {
|
||
return version
|
||
}
|
||
if versionParts.count == 2, let build {
|
||
return "\(version).\(build)"
|
||
}
|
||
return version
|
||
}
|
||
}
|
||
|
||
private extension String {
|
||
nonisolated var nonEmpty: String? {
|
||
isEmpty ? nil : self
|
||
}
|
||
}
|