feat(bg): add background feed refresh every ~30 min
Registers com.kisani.jarvis.feed.refresh as a BGAppRefreshTask. On each fire it fetches the latest 40 stories and upserts CachedStory rows so the SwiftData cache is warm before the user opens the app. Already-cached rows have signalScore / sourceCount refreshed in-place. Single ModelContainer owned by JarvisApp and shared via BackgroundRefreshManager.container to avoid multi-container conflicts. BG task ID registered in AppDelegate and declared in project.yml. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,7 +8,7 @@ import BackgroundTasks
|
||||
final class AppDelegate: NSObject, UIApplicationDelegate {
|
||||
func application(_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
|
||||
// Register the briefing background-refresh handler before launch completes.
|
||||
// Briefing notifications refresh
|
||||
BGTaskScheduler.shared.register(forTaskWithIdentifier: jarvisBriefingRefreshID, using: nil) { task in
|
||||
Task { @MainActor in
|
||||
await NotificationManager.shared.applySettings()
|
||||
@@ -16,6 +16,13 @@ final class AppDelegate: NSObject, UIApplicationDelegate {
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -31,6 +38,13 @@ struct JarvisApp: App {
|
||||
@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 {
|
||||
@@ -48,12 +62,15 @@ struct JarvisApp: App {
|
||||
.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(for: [CachedStory.self, CachedArticle.self, ReadStory.self,
|
||||
SavedStory.self, SeenStory.self])
|
||||
.modelContainer(container)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user