Thanks for being a part of WWDC25!

How did we do? We’d love to know your thoughts on this year’s conference. Take the survey here

Background process not working in TestFlight

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

First, you may want to read about iOS Background Execution Limits

You may also want to read about the built-in background fetch methods in HealthKit which you may find more appropriate for your use case.


Argun Tekant /  DTS Engineer / Core Technologies

Background process not working in TestFlight
 
 
Q