I'm trying to make use of the background tasks to prefetch content while the app is in background. It works fine for a single task. When multiple tasks are registered (for different refresh intervals), only the first one is getting triggered. Not sure what I'm missing. I have posted few code blocks from a sample app I'm trying to build.
Following is the list of identifiers defined in Info.plist.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.mycompany.myapp.task.refresh3</string>
<string>com.mycompany.myapp.task.refresh2</string>
<string>com.mycompany.myapp.task.refresh1</string>
</array>
Below is basically how I'm trying to make it work.
@objc func registerTasks() {
registerTask(Self.backgroundTaskIdentifier1)
registerTask(Self.backgroundTaskIdentifier2)
registerTask(Self.backgroundTaskIdentifier3)
}
private func registerTask(_ identifier: String) {
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: identifier)
let isRegistered = BGTaskScheduler.shared.register(forTaskWithIdentifier: identifier, using: queue) { task in
self.refresh(identifier: identifier)
task.setTaskCompleted(success: true)
self.scheduleAppRefresh(identifier: identifier)
}
if isRegistered {
scheduleAppRefresh(identifier: identifier)
}
}
`
@objc func scheduleAppRefresh(identifier: String) {
let request = BGAppRefreshTaskRequest(identifier: identifier)
if identifier == Self.backgroundTaskIdentifier1 {
let newDate = Date(timeIntervalSinceNow: 1 * 60 * 60)
request.earliestBeginDate = newDate
} else if identifier == Self.backgroundTaskIdentifier2 {
let newDate = Date(timeIntervalSinceNow: 2 * 60 * 60)
request.earliestBeginDate = newDate
} else if identifier == Self.backgroundTaskIdentifier3 {
let newDate = Date(timeIntervalSinceNow: 3 * 60 * 60)
request.earliestBeginDate = newDate
}
do {
try BGTaskScheduler.shared.submit(request)
UserDefaultsmanager.shared.setTime(time: "refresh scheduled for: \(identifier)")
} catch {
UserDefaultsmanager.shared.setTime(time: "Couldn't schedule app refresh")
}
}