Quick start
01 Sept 2026 · Field Track 360
ready() registers the background task handler, and registering after launch completes throws.
``` import SwiftUI import TrackItCore
@main struct MyApp: App { init() { Task { _ = await TrackIt.shared.ready() } }
var body: some Scene { WindowGroup { ContentView() } } } ```
The permission ladder is ordered
Always can only be requested from When-In-Use.
``` let tier = await TrackIt.shared.permissions().requestWhenInUse() guard tier != .none else { return }
switch await TrackIt.shared.permissions().requestAlways() { case .alreadyGranted, .granted: break case .needsWhenInUseFirst, .denied: return case .needsSettings(let url): await UIApplication.shared.open(url); return @unknown default: return }
switch await TrackIt.shared.start(tag: "delivery-run") { case .success(let session): print("recording \(session.id)") case .failure(let code, let message): print("refused - \(code.rawValue): \(message)") @unknown default: break } ```
Why @unknown default
The SDK never throws into your task; it returns TrackItResult. Every public enum is non-frozen, because this ships as a binary with library evolution enabled. Your switch needs @unknown default so a newer SDK adding a case does not break your build - and fold the unknown into the conservative branch, because an outcome you cannot read is not evidence that something succeeded.