summaryrefslogtreecommitdiff
path: root/DomainDig/AppInfo.swift
diff options
context:
space:
mode:
Diffstat (limited to 'DomainDig/AppInfo.swift')
-rw-r--r--DomainDig/AppInfo.swift52
1 files changed, 52 insertions, 0 deletions
diff --git a/DomainDig/AppInfo.swift b/DomainDig/AppInfo.swift
new file mode 100644
index 0000000..28b0826
--- /dev/null
+++ b/DomainDig/AppInfo.swift
@@ -0,0 +1,52 @@
+import Foundation
+import UIKit
+
+/// Runtime app metadata read from the bundle, plus the locally-assembled
+/// diagnostics used to prefill an issue report. Nothing here touches the network
+/// or collects any identifier beyond the app version, iOS version, and hardware
+/// model string.
+enum AppInfo {
+ /// CFBundleShortVersionString (marketing version), falling back to the
+ /// compiled-in `AppVersion.current` if the Info.plist key is missing.
+ static var marketingVersion: String {
+ Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? AppVersion.current
+ }
+
+ /// CFBundleVersion (build number).
+ static var buildNumber: String {
+ Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "—"
+ }
+
+ /// "5.0.0 (build 45)" — version alongside build, as the App Info row shows it.
+ static var versionDisplay: String {
+ "\(marketingVersion) (build \(buildNumber))"
+ }
+
+ static let minimumOS = "17.6"
+
+ static var systemVersion: String {
+ UIDevice.current.systemVersion
+ }
+
+ /// Hardware model identifier (e.g. "iPhone15,2") — a model string, not a
+ /// per-device identifier.
+ static var deviceModel: String {
+ var systemInfo = utsname()
+ uname(&systemInfo)
+ let identifier = withUnsafeBytes(of: &systemInfo.machine) { raw -> String in
+ let bytes = raw.prefix { $0 != 0 }
+ return String(decoding: bytes, as: UTF8.self)
+ }
+ return identifier.isEmpty ? "Unknown" : identifier
+ }
+
+ /// Diagnostics prefilled into an issue report. Shown to the user before any
+ /// send — never collected silently.
+ static var diagnosticsReport: String {
+ """
+ DomainDig \(versionDisplay)
+ iOS \(systemVersion)
+ Device \(deviceModel)
+ """
+ }
+}