Background Task — het iOS-mechanisme waarmee een app een gestarte bewerking kan voltooien na het overschakelen naar de achtergrondmodus. Het systeem wijst beperkte tijd (tot 30 seconden) toe voor het uitvoeren van de taak, waarna de app geforceerd wordt onderbroken. Volgens Apple, 2026 is het gebruik van een expiration handler een verplichte vereiste voor het correct afronden van een achtergrondtaak.
Belangrijkste punten
Background Task is een softwaremechanisme in iOS waarmee een app de uitvoeringstijd kan verlengen na het overschakelen naar de achtergrondmodus. Wanneer de gebruiker de app minimaliseert, roept het systeem UIApplicationDelegate.applicationDidEnterBackground aan. Als er op dat moment een kritieke bewerking wordt uitgevoerd (gegevens opslaan, verzoek verzenden), kan de app via beginBackgroundTask extra tijd aanvragen.
Zonder het gebruik van Background Task wordt de app 3-5 seconden na het gaan naar de achtergrond geforceerd onderbroken. Alle onvoltooide bewerkingen worden afgebroken: gegevens worden niet opgeslagen, netwerkverzoeken worden verbroken, toestanden gaan verloren. Background Task geeft de app tot 30 seconden om deze bewerkingen correct af te ronden.
beginBackgroundTask verscheen in iOS 4.0 — de eerste release die multitasking ondersteunde. Vóór iOS 4 werd de app volledig afgesloten bij het indrukken van de Home-knop. Vanaf iOS 7 kwamen Background Fetch en URLSession background configuration. Vanaf iOS 13 raadt Apple BGTaskScheduler aan voor nieuwe projecten, maar beginBackgroundTask blijft relevant voor kortdurende bewerkingen.
beginBackgroundTask — een methode van UIApplication die een taak registreert en een unieke identifier UIBackgroundTaskIdentifier retourneert. Het systeem verlengt de timer voor achtergronduitvoering. Wanneer de tijd is verstreken, wordt de expiration handler aangeroepen, waarna de app endBackgroundTask(identifier:) moet aanroepen voor een correcte voltooiing.
Stap 1 — de app ontvangt de melding didEnterBackground. Stap 2 — beginBackgroundTask(expirationHandler:) wordt aangeroepen. Stap 3 — de kritieke bewerking (opslaan, netwerkverzoek) wordt uitgevoerd. Stap 4 — bij voltooiing wordt endBackgroundTask(identifier:) aangeroepen. Als de bewerking niet binnen 30 seconden is voltooid — roept het systeem de expiration handler aan en moet de app de taak onmiddellijk beëindigen.
var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
func startBackgroundTask() {
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
// Expiration handler
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
}
func finishBackgroundTask() {
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
De eigenschap backgroundTimeRemaining retourneert het aantal seconden dat nog rest tot de geforceerde beëindiging van de achtergrondtaak. De waarde neemt in realtime af. Als de app niet op de achtergrond draait — retourneert het DBL_MAX. Gebruik deze eigenschap om het gedrag aan te passen: wanneer er minder dan 5 seconden over zijn, onderbreek dan langdurige bewerkingen en sla de voortgang op.
Een app kan meerdere Background Tasks tegelijk registreren. Elke taak krijgt zijn eigen identifier. De totale uitvoeringstijd wordt opgeteld — bij 3 geregistreerde taken kan de app tot 90 seconden krijgen. Het systeem kan de app echter eerder beëindigen als resources zijn uitgeput of de batterijlimiet is overschreden.
Expiration handler is een codeblok dat door het systeem wordt aangeroepen wanneer de toegewezen tijd voor de achtergrondtaak is verstreken. De aanwezigheid van een expiration handler is een verplichte vereiste van Apple. Zonder kan de app geforceerd door het systeem worden beëindigd en kunnen gegevens verloren gaan.
De expiration handler moet minimale acties uitvoeren om de app-status op te slaan: huidige gegevens in permanente opslag bewaren, endBackgroundTask aanroepen met de juiste identifier en de identifier instellen op .invalid. Binnen de expiration handler is het starten van nieuwe langdurige bewerkingen verboden — de uitvoeringstijd is beperkt tot 1-2 seconden.
func handleExpiration() {
// Voortgang van uitvoering opslaan
saveProgressToUserDefaults()
// Actieve netwerkverzoeken annuleren
currentTask?.cancel()
// Background Task beëindigen
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
// Registratie met expiration handler
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
withName: "SaveDocument",
expirationHandler: handleExpiration
)
De meest voorkomende fout is het niet aanroepen van endBackgroundTask binnen de expiration handler. In dit geval blijft het systeem de taak als actief beschouwen, gaat de app niet naar de status Suspended en raakt de batterij leeg. De tweede fout is het starten van langdurige bewerkingen binnen de expiration handler. Het systeem kan de app beëindigen voordat ze zijn voltooid, met gegevensverlies tot gevolg.
In de expiration handler is de uitvoeringstijd kritiek kort — meestal minder dan 1 seconde. Daarom kunnen er binnen de handler geen: complexe berekeningen, netwerkverzoeken, grote hoeveelheden gegevens naar CoreData schrijven worden uitgevoerd. Alleen atomische bewerkingen: één sleutel in UserDefaults schrijven, een statusvlag instellen, endBackgroundTask aanroepen.
Laten we de volledige implementatie van Background Task bekijken voor het opslaan van een document wanneer de app naar de achtergrond gaat. Het voorbeeld omvat taakregistratie, uitvoering van de bewerking met controle van de resterende tijd en correcte voltooiing via endBackgroundTask.
Bij het gaan naar de achtergrond start de app het opslaan van een groot document. Background Task geeft tot 30 seconden voor de bewerking. Als de tijd verloopt — slaat de expiration handler tussenresultaten op. Na het voltooien van het opslaan wordt endBackgroundTask aangeroepen om resources vrij te maken.
class DocumentManager {
private var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid
func saveDocumentInBackground(document: Document) {
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
self.saveProgress(document)
self.endBackgroundTask()
}
DispatchQueue.global().async {
document.save()
self.endBackgroundTask()
}
}
private func endBackgroundTask() {
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
}
Netwerkverzoeken op de achtergrond vereisen speciale aandacht — de expiration handler kan het verzoek onderbreken voordat het antwoord is ontvangen. Gebruik URLSession met dataTask en controleer backgroundTimeRemaining voor het verzenden. Als er minder dan 5 seconden resteren — stel het verzenden dan uit tot de volgende keer dat de app wordt geactiveerd.
func sendCriticalData(data: Data) {
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
// Gegevens opslaan voor opnieuw verzenden
saveForRetry(data)
self.endBackgroundTask()
}
let task = URLSession.shared.dataTask(with: request) { _, _, error in
if error != nil {
saveForRetry(data)
}
self.endBackgroundTask()
}
task.resume()
}
Voor langdurige bewerkingen, monitor UIApplication.shared.backgroundTimeRemaining. Als de waarde onder de drempel (10 seconden) zakt, onderbreek dan de huidige bewerking en start het opslaan van tussenresultaten. Dit maakt een correcte afronding mogelijk voordat de expiration handler geforceerd wordt aangeroepen.
Background Task is een krachtig mechanisme, maar onjuist gebruik leidt tot problemen met de batterij en prestaties. Het volgen van de aanbevelingen van Apple en beproefde praktijken uit de community helpt typische fouten te voorkomen en zorgt voor een stabiele werking van de app.
Rond Background Task zo snel mogelijk af. Elke seconde achtergronduitvoering verbruikt batterijvermogen. Optimale tijd — minder dan 5 seconden. Als de bewerking langer duurt — overweeg dan het gebruik van BGTaskScheduler of Background Modes. Verleng de taak niet kunstmatig via beginBackgroundTask-aanroepen zonder echte noodzaak.
Sla UIBackgroundTaskIdentifier op als eigenschap van een klasse of structuur. Geef het nooit door als globale variabele — dit leidt tot conflicten bij meerdere taken. Stel de identifier in op .invalid na het aanroepen van endBackgroundTask om dubbele voltooiing te voorkomen.
Schakel in de Xcode Simulator de app naar de achtergrond via de Home-knop (Command + Shift + H). Gebruik Debug — Simulate Background Fetch voor het testen van achtergrondactivering. Om tijdsverloop te simuleren, stel de omgevingsvariabele BACKGROUND_TASK_SIMULATE_EXPIRATION = YES in — de expiration handler wordt na 5 seconden aangeroepen.
// Restende tijd controleren voor start van bewerking
let remaining = UIApplication.shared.backgroundTimeRemaining
guard remaining > 10.0 else {
// Onvoldoende tijd — taak uitstellen
scheduleForNextLaunch()
return
}
// Bewerking uitvoeren met tijdscontrole
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
saveProgress()
self.endBackgroundTask()
}
De expiration handler vangt self — dit kan een retain cycle veroorzaken als backgroundTaskID als eigenschap van hetzelfde object wordt opgeslagen. Gebruik [weak self] in de closure of sla de identifier apart op. Een retain cycle leidt tot geheugenlekken — het object wordt pas vrijgegeven wanneer de app wordt afgesloten.
Met de release van iOS 13 introduceerde Apple BGTaskScheduler — een moderne vervanging voor de oude Background Task API. Beide mechanismen lossen vergelijkbare taken op, maar BGTaskScheduler biedt meer controle en flexibiliteit. Inzicht in de verschillen helpt bij het kiezen van het juiste gereedschap voor een specifiek scenario.
| Kenmerk | Background Task | BGTaskScheduler |
|---|---|---|
| iOS-versie | 4.0+ | 13.0+ |
| Max. tijd | 30 seconden | 30 s / 10 min (processing) |
| Initiatie | didEnterBackground | Planning + systeem |
| Uitvoeringsgarantie | Alleen bij overgang naar achtergrond | Op elk voor het systeem geschikt moment |
| Expiration handler | Ja, verplicht | Ja, via task.expirationHandler |
| Internet | Vereist bij start | Beschikbaar via requiresNetworkConnectivity |
| Opladen | Niet vereist | Optioneel voor processing |
beginBackgroundTask is geschikt voor kortdurende bewerkingen die onmiddellijk moeten worden uitgevoerd bij het gaan naar de achtergrond: status opslaan, netwerkverzoek voltooien, gegevens cachen. De API is eenvoudig en vereist geen configuratie van Info.plist of registratie van identifiers. Ideaal voor bewerkingen die minder dan 10 seconden duren.
BGTaskScheduler is geschikt voor taken die op elk geschikt moment kunnen worden uitgevoerd: periodieke synchronisatie, cache opschonen, widgets updaten. Het systeem kiest zelf het optimale moment rekening houdend met het gedrag van de gebruiker en de batterijstatus. Gebruik BGProcessingTask voor langdurige bewerkingen (tot 10 minuten).
Beide API's kunnen in één app worden gebruikt. Background Task — voor directe bewerkingen bij het gaan naar de achtergrond (klad opslaan). BGTaskScheduler — voor geplande updates (synchronisatie elke 6 uur). Taakverdeling zorgt voor correcte gegevensopslag en energie-efficiënte achtergrondservice.
Veelgestelde vragen
Ja, beginBackgroundTask kan op elk moment tijdens de werking van de app worden aangeroepen. De systeemtoewijzing van tijd begint echter pas na het overschakelen naar de achtergrond. Als de app op de voorgrond staat, heeft de aanroep van beginBackgroundTask geen effect — backgroundTimeRemaining retourneert DBL_MAX en de taak wordt geactiveerd bij het gaan naar de achtergrond.
Als endBackgroundTask niet wordt aangeroepen, blijft het systeem de app als actief op de achtergrond beschouwen. Na 30 seconden wordt de expiration handler aangeroepen, maar als ook daarin geen endBackgroundTask staat — blijft de app in het geheugen en verbruikt batterij. In iOS 13+ beëindigt het systeem zo'n app geforceerd na 3 minuten.
De standaardtijd is 30 seconden. Verlenging is alleen mogelijk via Background Modes: Audio (afspelen), Location (geolocatie), Bluetooth (BLE). Of via BGProcessingTask (iOS 13+) — tot 10 minuten bij opladen en Wi-Fi. beginBackgroundTask biedt zelf geen manier om de limiet te verhogen.
Ja, iPadOS ondersteunt beginBackgroundTask volledig met dezelfde beperkingen als iOS. Op een iPad met Stage Manager kan de app langer in het geheugen blijven — het systeem onderbreekt apps minder vaak vanwege de grotere hoeveelheid RAM. Maar de limiet van 30 seconden voor een achtergrondtaak blijft van kracht.
Sluit het apparaat aan op Xcode, start de app, minimaliseer deze — in de console verschijnen systeemlogs. Gebruik sysdiagnose voor het verzamelen van gedetailleerde logs: dwing sysdiagnose af vanaf het apparaat (Volume Up + Down + Power). In de Xcode Debug Navigator volg je de activiteit van achtergrondtaken.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook