Hi everyone,
I recently built an iOS application that fetches the healthkit data with the BGProcessingTask. It is working as expected in the debug with the physical device connected but its not working in Testflight. I printed out the logs but they don't show that the background process's running. Here is my code snippet.
func registerBackgroundTask() {
BGTaskScheduler.shared.register(forTaskWithIdentifier: taskIdentifier, using: nil) { task in
LogManager.shared.addBackgroundProcessLog("registering the background task...")
print("registering the background task...")
self.handleBackgroundTask(task: task as! BGProcessingTask)
}
}
func scheduleBackgroundHealthKitSync() {
print("scheduling background task...")
LogManager.shared.addBackgroundProcessLog("scheduling background task...")
let request = BGProcessingTaskRequest(identifier: taskIdentifier)
request.earliestBeginDate = Date(timeIntervalSinceNow: 60 * 1)
request.requiresNetworkConnectivity = true
request.requiresExternalPower = false
do {
try BGTaskScheduler.shared.submit(request)
print("BGProcessingTask scheduled")
LogManager.shared.addBackgroundProcessLog("BGProcessingTask scheduled")
} catch {
print("Failed to schedule task: \(error)")
LogManager.shared.addBackgroundProcessLog("Failed to schedule task: \(error)", isError: true)
print(LogManager.shared.backgroundProcessLogs)
}
}
func handleBackgroundTask(task: BGProcessingTask) {
LogManager.shared.addBackgroundProcessLog("handleBackgroundTask triggered")
print("handleBackgroundTask triggered")
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
// Reschedule the background sync for the next time
scheduleBackgroundHealthKitSync()
var taskCancelled = false
// Handling expiration
task.expirationHandler = {
taskCancelled = true
LogManager.shared.addBackgroundProcessLog("Background task expired", isError: true)
print("Background task expired")
dispatchGroup.leave()
}
let healthKitManager = HealthKitManager.shared
// Start the background sync operation
healthKitManager.fetchAndSendAllTypes() { success in
if success {
LogManager.shared.addBackgroundProcessLog("HealthKit sync completed successfully")
print("HealthKit sync completed successfully")
} else {
LogManager.shared.addBackgroundProcessLog("HealthKit sync failed", isError: true)
print("HealthKit sync failed")
}
dispatchGroup.leave()
}
// Notify when all tasks are completed
dispatchGroup.notify(queue: .main) {
// Check if the task was cancelled using your own flag or state
if taskCancelled {
task.setTaskCompleted(success: false) // Fail the task if it was cancelled
} else {
task.setTaskCompleted(success: true) // Complete successfully if not cancelled
}
LogManager.shared.addBackgroundProcessLog("Background task ended with status: \(taskCancelled == false)")
print("Background task completed with success: \(taskCancelled == false)") // Logs success or failure
}
}
Here are the logs from my device.
scheduling background task...
BGProcessingTask scheduled