import Foundation /// Alles, was den Namen der App trägt — an einer Stelle. /// /// Zum Umbenennen reichen zwei Stellen: `appName` hier und in `project.yml` /// die drei Werte `name`, `PRODUCT_NAME` und `CFBundleDisplayName`. Die /// übersetzten Texte nennen den Namen bewusst nirgends aus — sonst bliebe er /// dort stehen, und zwar unbemerkt, weil nichts fehlschlägt. /// /// Der Name steht noch nicht fest. Damit ein späterer Wechsel nicht zur Suche /// quer durch den Quelltext wird, greift die App nirgends auf ein hart /// geschriebenes „Halo" zu, sondern immer hierauf. Zu ändern sind dann genau /// zwei Dinge: diese Datei und `project.yml` (Produktname, Bundle-Kennung, /// Anzeigename). /// /// Die Typen aus HaloKit behalten ihre Namen — sie sind Bauteile, keine Marke. enum Branding { /// Wie die App sich selbst nennt. static let appName = "Halo" /// Unter welchem Namen die Tokens im Schlüsselbund liegen. /// /// An die Bundle-Kennung gebunden statt an den Anzeigenamen: eine spätere /// Umbenennung der App soll niemanden abmelden. static var keychainService: String { Bundle.main.bundleIdentifier ?? "com.scarriffleservices.halo" } /// Wann dieser Build entstanden ist. /// /// Gelesen als Änderungsdatum der eigenen Binärdatei — kein Build-Skript, /// keine erzeugte Datei, und immer richtig: die Binärdatei entsteht genau /// dann, wenn gebaut wird. /// /// Steht in den Einstellungen. Ohne diese Angabe lässt sich nicht /// unterscheiden, ob ein Fehler noch besteht oder ob nur ein alter Build /// auf dem Gerät liegt — und das kostet jedes Mal eine Rückfrage. static var buildStamp: String { guard let url = Bundle.main.executableURL, let date = try? url.resourceValues(forKeys: [.contentModificationDateKey]) .contentModificationDate else { return "—" } return date.formatted(date: .abbreviated, time: .shortened) } /// Die Version aus dem Bundle, für die Kopfzeile `X-Plex-Version`. static var version: String { Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "0" } }