// JarvisApp.swift import SwiftUI import SwiftData import UIKit import BackgroundTasks final class AppDelegate: NSObject, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { // Briefing notifications refresh BGTaskScheduler.shared.register(forTaskWithIdentifier: jarvisBriefingRefreshID, using: nil) { task in Task { @MainActor in await NotificationManager.shared.applySettings() NotificationManager.shared.scheduleBackgroundRefresh() task.setTaskCompleted(success: true) } } // Story feed cache refresh BGTaskScheduler.shared.register(forTaskWithIdentifier: jarvisFeedRefreshID, using: nil) { task in guard let refresh = task as? BGAppRefreshTask else { task.setTaskCompleted(success: false); return } BackgroundRefreshManager.handleFeedRefresh(task: refresh) } return true } } @main struct JarvisApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate @AppStorage("appearanceMode") private var appearanceMode: AppearanceMode = .dark @StateObject private var settings = ServerSettings.shared @StateObject private var store = StoryStore.shared @StateObject private var ws = WebSocketManager.shared @StateObject private var connectivity = ConnectivitySettings.shared @StateObject private var connManager = ConnectivityManager.shared @StateObject private var notifications = NotificationManager.shared // Single ModelContainer instance shared with BackgroundRefreshManager. private let container: ModelContainer = { let schema = Schema([CachedStory.self, CachedArticle.self, ReadStory.self, SavedStory.self, SeenStory.self]) return try! ModelContainer(for: schema) }() var body: some Scene { WindowGroup { Group { if settings.isConfigured { RootTabView() } else { OnboardingView() } } .preferredColorScheme(appearanceMode.colorScheme) .environmentObject(settings) .environmentObject(store) .environmentObject(ws) .environmentObject(connectivity) .environmentObject(connManager) .environmentObject(notifications) .task { // Wire the shared container before scheduling BG work. BackgroundRefreshManager.container = container BackgroundRefreshManager.scheduleFeedRefresh() connManager.start() await connManager.resolveAndActivate() await notifications.bootstrap() } } .modelContainer(container) } }