Initial scaffold — NASBackup iOS app
Full project scaffold: XcodeGen project.yml, Core models/protocols/errors, SMBService (kishikawakatsumi/SMBClient), SFTPService (Citadel 0.9.2), PhotoLibraryService, LANMonitor, BackupEngine, BackgroundTaskManager, all feature UIs (Login, Connect, Browse, Backup, History, Settings), Shared components and theme. Builds clean with zero errors. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
72
Services/BackgroundTaskManager.swift
Normal file
72
Services/BackgroundTaskManager.swift
Normal file
@@ -0,0 +1,72 @@
|
||||
import Foundation
|
||||
import BackgroundTasks
|
||||
|
||||
final class BackgroundTaskManager {
|
||||
static let backupTaskID = "com.albert.nasbackup.backup"
|
||||
static let refreshTaskID = "com.albert.nasbackup.refresh"
|
||||
|
||||
static func registerTasks() {
|
||||
BGTaskScheduler.shared.register(
|
||||
forTaskWithIdentifier: backupTaskID,
|
||||
using: nil
|
||||
) { task in
|
||||
guard let task = task as? BGProcessingTask else { return }
|
||||
BackgroundTaskManager.handleBackupTask(task)
|
||||
}
|
||||
|
||||
BGTaskScheduler.shared.register(
|
||||
forTaskWithIdentifier: refreshTaskID,
|
||||
using: nil
|
||||
) { task in
|
||||
guard let task = task as? BGAppRefreshTask else { return }
|
||||
BackgroundTaskManager.handleRefreshTask(task)
|
||||
}
|
||||
}
|
||||
|
||||
static func scheduleBackup(delay: TimeInterval = 30) {
|
||||
let request = BGProcessingTaskRequest(identifier: backupTaskID)
|
||||
request.requiresNetworkConnectivity = true
|
||||
request.requiresExternalPower = false
|
||||
request.earliestBeginDate = Date(timeIntervalSinceNow: delay)
|
||||
do {
|
||||
try BGTaskScheduler.shared.submit(request)
|
||||
} catch {
|
||||
print("BGTask schedule failed: \(error)")
|
||||
}
|
||||
}
|
||||
|
||||
static func scheduleAppRefresh() {
|
||||
let request = BGAppRefreshTaskRequest(identifier: refreshTaskID)
|
||||
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
|
||||
do {
|
||||
try BGTaskScheduler.shared.submit(request)
|
||||
} catch {
|
||||
print("BGRefresh schedule failed: \(error)")
|
||||
}
|
||||
}
|
||||
|
||||
private static func handleBackupTask(_ task: BGProcessingTask) {
|
||||
scheduleBackup()
|
||||
let engine = BackupEngine.shared
|
||||
task.expirationHandler = { Task { await engine.cancel() } }
|
||||
Task {
|
||||
do {
|
||||
let store = ConnectionStore.shared
|
||||
guard let connection = store.savedConnection else {
|
||||
task.setTaskCompleted(success: false)
|
||||
return
|
||||
}
|
||||
let filter = store.backupFilter
|
||||
_ = try await engine.run(connection: connection, filter: filter, triggeredByLAN: true)
|
||||
task.setTaskCompleted(success: true)
|
||||
} catch {
|
||||
task.setTaskCompleted(success: false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static func handleRefreshTask(_ task: BGAppRefreshTask) {
|
||||
scheduleAppRefresh()
|
||||
task.setTaskCompleted(success: true)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user