BGTaskScheduler — is het Apple-framework voor het plannen en uitvoeren van achtergrondtaken in iOS 13 en nieuwer. Het heeft de verouderde Background Fetch en performFetch vervangen en biedt een uniforme API voor het werken met achtergrondbewerkingen. Volgens Apple Developer Documentation, 2026 omvat het framework twee typen taken: BGProcessingTask voor langdurige bewerkingen en BGAppRefreshTask voor korte inhoudsupdates.
Belangrijkste punten
BGTaskScheduler — is het systeemframework van Apple, geïntroduceerd in iOS 13, dat gecentraliseerd het uitvoeren van achtergrondtaken beheert. Voor de komst ervan gebruikten ontwikkelaars UIApplication backgroundTasks, performFetch en gebeurtenisafhandeling in appDelegate, wat leidde tot codefragmentatie en onvoorspelbaar gedrag.
Het framework werkt volgens het principe van uitgestelde planning: de applicatie registreert taken met unieke identifiers, en iOS bepaalt zelf het optimale moment voor uitvoering. Het systeem houdt rekening met het batterijniveau, gebruikersactiviteit, netwerkstatus en andere factoren.
Belangrijkste mogelijkheden omvatten het werken met zowel korte als langdurige achtergrondbewerkingen. In tegenstelling tot AlarmManager in Android, garandeert BGTaskScheduler geen exacte uitvoeringstijd — het systeem behoudt zich het recht voor om de taak uit te stellen als de omstandigheden ongunstig zijn.
BGTaskScheduler gebruikt een architectuur gebaseerd op handlers. De applicatie registreert een handler voor elk taaktype, en het systeem roept deze aan wanneer het juiste moment aanbreekt. Het framework voert de taak niet direct uit — het stelt de applicatie alleen op de hoogte dat het tijd is om deze te starten.
Registratie begint met het declareren van de taakidentifier in Info.plist via de array BGTaskSchedulerPermittedIdentifiers. Vervolgens wordt in de applicatiecode de methode registerHandler(forTaskWithIdentifier:) aangeroepen met een handler-closure.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// aangeroepen bij geforceerd beëindigen
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Na registratie moet de applicatie expliciet de uitvoering van de taak aanvragen via submitTaskRequest. Het verzoek bevat de taakidentifier en de datum van de vroegst mogelijke start. Het systeem slaat het verzoek op en verwerkt het wanneer het de omstandigheden geschikt acht.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Planningsfout: \(error)")
}
BGTaskScheduler biedt twee hoofdtypen taken, elk ontworpen voor zijn eigen gebruiksscenario. De juiste typekeuze beïnvloedt direct de kans op succesvolle uitvoering van de taak door het systeem.
BGAppRefreshTask is bedoeld voor korte achtergrondupdates van inhoud: nieuwe gegevens laden, synchroniseren met de server, widgets bijwerken. De uitvoeringstijd is beperkt tot 30 seconden, waarna het systeem de taak geforceerd beëindigt. Dit type taken wordt vaker uitgevoerd dan BGProcessingTask en heeft een hogere prioriteit.
BGProcessingTask is bedoeld voor langere bewerkingen: verwerken van mediabestanden, indexeren van Core Data-gegevens, maken van back-ups. De taak kan enkele minuten duren, maar het systeem start deze minder vaak en alleen onder gunstige omstandigheden — bij stroomaansluiting, stabiele Wi-Fi en lage apparaatbelasting.
| Parameter | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Tijdslimiet | 30 seconden | enkele minuten |
| Startfrequentie | hoog | laag |
| Voorwaarden | alle | stroom + Wi-Fi |
| Vereist stroom | nee | aanbevolen |
| Voorbeeld | feed bijwerken | video verwerken |
Correcte registratie — is een verplichte voorwaarde voor het functioneren van BGTaskScheduler. Als de taak niet is geregistreerd in Info.plist, negeert het systeem elk verzoek tot uitvoering.
Aan het bestand Info.plist wordt een array BGTaskSchedulerPermittedIdentifiers toegevoegd met een lijst van tekstuele identifiers. Elke identifier moet uniek zijn binnen de applicatie. Apple raadt het gebruik van omgekeerde domeinnotatie aan.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Voor planning wordt de methode submitTaskRequest gebruikt. Als de taak niet langer nodig is, kan deze worden geannuleerd via cancelTaskRequest of cancelAllTaskRequests. Het systeem annuleert automatisch taken bij het verwijderen van de app of het resetten van gegevens.
BGTaskScheduler biedt de mogelijkheid om de status van geplande taken te volgen via getPendingTaskRequests. Deze methode retourneert een lijst van alle actieve verzoeken met informatie over hun type, identifier en earliestBeginDate. Voor elk verzoek kan worden gecontroleerd of het al is uitgevoerd of geannuleerd, en kan een beslissing worden genomen over herplanning.
Het is belangrijk op te merken dat het systeem geen directe Callback geeft over het succes van de achtergrondtaak — de handler moet zelf het resultaat rapporteren via de taakeigenschappen. setTaskCompleted maakt het mogelijk de taak als succesvol voltooid te markeren, waarna het systeem de volgende geplande taak van dit type kan starten. Als de taak setTaskCompleted niet heeft aangeroepen, beschouwt het systeem deze als voltooid na verloop van tijd of bij geforceerd beëindigen.
Voor diagnose van problemen wordt aanbevolen OSLog te gebruiken in de handler en logs te bekijken via Console.app op de Mac. Apple biedt ook de tool MetricKit voor prestatieanalyse van achtergrondtaken — deze verzamelt gegevens over uitvoeringstijd, energieverbruik en startfrequentie, die kunnen worden gebruikt voor optimalisatie.
// Annuleren van specifieke taak
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Annuleren van alle taken
BGTaskScheduler.shared.cancelAllTaskRequests()
// Geplande taken controleren
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("\(requests.count) taken gepland")
}
BGTaskScheduler legt strikte beperkingen op aan achtergrondwerk. Het systeem kan de taak voor onbepaalde tijd uitstellen als de omstandigheden ongunstig zijn. De ontwikkelaar moet begrijpen dat het framework niet bedoeld is voor realtime taken.
Belangrijke beperkingen zijn onder meer: het systeem garandeert geen uitvoering van de taak op de opgegeven tijd, het maximale aantal gelijktijdige taken is beperkt, en het energieverbruik wordt strikt gecontroleerd. Het achter elkaar starten van meerdere taken kan leiden tot samenvoeging of annulering.
Om de kans op uitvoering te vergroten, wordt aanbevolen earliestBeginDate niet eerder in te stellen dan 1 uur voor BGProcessingTask en 15 minuten voor BGAppRefreshTask. Het is ook belangrijk om expirationHandler af te handelen — als de taak niet binnen de limiet valt, roept het systeem deze handler aan voor correcte beëindiging. Herplanning moet binnen de handler zelf plaatsvinden om een continue cyclus van achtergrondwerk te behouden.
Een andere belangrijke beperking betreft netwerkverzoeken. BGTaskScheduler garandeert geen actieve netwerkverbinding tijdens de uitvoering van de taak. De applicatie moet zelf de netwerkbeschikbaarheid controleren via NWPathMonitor en de verwerking uitstellen als de verbinding ontbreekt. Dit verschilt van Android JobScheduler, die een taak alleen kan activeren bij verbinding met een specifiek netwerktype. In de praktijk combineren ontwikkelaars BGTaskScheduler vaak met achtergrond-URL-sessies van NSURLSession voor betrouwbaar gegevens laden.
Sinds macOS Catalina is BGTaskScheduler ook beschikbaar op de Mac. Dit maakt het mogelijk om cross-platform achtergrondtaken te maken voor UIKit-apps die op Apple Silicon draaien. Op watchOS werkt het framework beperkt — alleen korte BGAppRefreshTasks zijn beschikbaar voor het bijwerken van complicaties en het synchroniseren van gegevens met de iPhone. Ontwikkelaars moeten rekening houden met platformverschillen bij het plannen van de achtergrondarchitectuur.
Voor het debuggen van BGTaskScheduler biedt Apple verschillende tools. Het commando e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] in lldb forceert het starten van de achtergrondtaak, waarbij systeembeperkingen worden genegeerd. In Xcode is de vlag Simulate Background Fetch beschikbaar in het Debug-menu, die een korte achtergrondupdate emuleert. Voor prestatieanalyse wordt MetricKit gebruikt — dit verzamelt informatie over startfrequentie, uitvoeringsduur en energieverbruik van elke taak. Deze gegevens helpen bij het optimaliseren van de planningsfrequentie en het kiezen van het juiste taaktype.
In de praktijk is BGTaskScheduler geschikt voor het bijwerken van widgetgegevens, iCloud-synchronisatie, verwerking van pushmeldingen met inhoud en indexering van Spotlight-zoekopdrachten. Niet geschikt voor het verzenden van realtime analyses, chat-apps of taken die onmiddellijke uitvoering vereisen.
Voor diepgaande studie van BGTaskScheduler beveelt Apple de officiële WWDC-documentatie aan: de sessie „Advances in Background Tasks” (2020) behandelt migratie van verouderde API’s, en „Background Tasks in Practice” (2021) bevat echte gebruiksscenario’s. Ook nuttig is de sectie Energy Efficiency Guide, waarin wordt beschreven hoe het framework past in Apple’s algemene energiebesparingsstrategie. Codevoorbeelden zijn beschikbaar in de officiële Apple Developer-repository op GitHub met volledige projecten voor iOS en macOS.
Veelgestelde vragen
Background Fetch was beperkt tot één achtergrondtaak per applicatie en had geen prioriteitsmechanisme. BGTaskScheduler ondersteunt meerdere taken van verschillende typen, biedt een uniforme API en automatisch energiebeheer.
Apple stelt geen expliciete limiet aan het aantal geregistreerde identifiers, maar in de praktijk wordt aanbevolen niet meer dan 5–10 taken te gebruiken. Een groter aantal vermindert de kans op uitvoering van elke specifieke taak door concurrentie om systeembronnen.
Gebruik voor debuggen het commando e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] in lldb. Het forceert het starten van de taak, waarbij systeembeperkingen worden omzeild. Ook is de vlag Xcode Simulate Background Fetch beschikbaar in het Debug-menu.
Ja, BGTaskScheduler kan het proces starten, zelfs als de app geforceerd is gesloten door de gebruiker. Het systeem kan echter extra vertragingen toepassen en niet alle taaktypen garanderen starten in dit scenario.
Het systeem roept expirationHandler aan en geeft de taak een signaal om te beëindigen. Als de app dit signaal negeert en doorgaat met werken, forceert iOS het beëindigen van het proces. Daarna kan het systeem de prioriteit van alle achtergrondtaken van de app verlagen.
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