Files
steipete--codexbar/Sources/CodexBar/UpdateChannel.swift
T
2026-07-13 12:22:33 +08:00

74 lines
1.8 KiB
Swift

import Foundation
enum UpdateChannel: String, CaseIterable, Codable {
case stable
case beta
static let userDefaultsKey = "updateChannel"
static let sparkleBetaChannel = "beta"
var displayName: String {
switch self {
case .stable:
"Stable"
case .beta:
"Beta"
}
}
var description: String {
switch self {
case .stable:
"Receive only stable, production-ready releases."
case .beta:
"Receive stable releases plus beta previews."
}
}
var allowedSparkleChannels: Set<String> {
switch self {
case .stable:
[""]
case .beta:
["", UpdateChannel.sparkleBetaChannel]
}
}
static var current: Self {
if let rawValue = UserDefaults.standard.string(forKey: userDefaultsKey),
let channel = Self(rawValue: rawValue)
{
return channel
}
return defaultChannel
}
static var defaultChannel: Self {
defaultChannel(for: Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0")
}
static func defaultChannel(for appVersion: String) -> Self {
if let isPrereleaseValue = Bundle.main.object(forInfoDictionaryKey: "IS_PRERELEASE_BUILD"),
let isPrerelease = isPrereleaseValue as? Bool,
isPrerelease
{
return .beta
}
let prereleaseKeywords = ["beta", "alpha", "rc", "pre", "dev"]
let lowercaseVersion = appVersion.lowercased()
for keyword in prereleaseKeywords where lowercaseVersion.contains(keyword) {
return .beta
}
return .stable
}
}
extension UpdateChannel: Identifiable {
var id: String {
rawValue
}
}