Here is my class for reference
final class BackgroundTaskManager: NSObject {
private var cancellables = Set<AnyCancellable>()
func registerTasks() {
BGTaskScheduler.shared.register(forTaskWithIdentifier: BackgroundTaskManager.processingIdentifier, using: nil) { [manager = self] task in
manager.handle(task: task)
}
}
func cancelAllTasks() {
BGTaskScheduler.shared.cancelAllTaskRequests()
}
func scheduleTasks() {
scheduleProcessingTask()
}
private func scheduleProcessingTask() {
let request = BGProcessingTaskRequest(identifier: BackgroundTaskManager.processingIdentifier)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
request.requiresNetworkConnectivity = true
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print(error.localizedDescription)
}
}
}
extension BackgroundTaskManager {
private static let processingIdentifier = "SOMEIDENTIFIER"
}
extension BackgroundTaskManager {
public static let shared = BackgroundTaskManager()
}
extension BackgroundTaskManager {
func handle(task: BGTask) {
let provider = HealthDataProvider()
let steps = Future { promise in
provider.getTodaysSteps { result in
promise(result)
}
}
let distance = Future { promise in
provider.getDistance { result in
promise(result)
}
}
Publishers.Zip(steps, distance)
.flatMap { steps, distance -> AnyPublisher<HealthPostRequest.Parser.OutputType, Error> in
let date = Date()
let healthPostRequest = HealthPostRequest(steps: steps, distance: distance, date: date)
return API.shared.postHealth(healthPostRequest: healthPostRequest)
.eraseToAnyPublisher()
}
.sink()
.store(in: &cancellables)
}
}