BGTaskScheduler ist ein Apple-Framework zum Planen und Ausführen von Hintergrundaufgaben in iOS 13 und neuer. Es ersetzte die veralteten Background Fetch und performFetch und bietet eine einheitliche API für Hintergrundoperationen. Laut Apple Developer Documentation, 2026 umfasst das Framework zwei Aufgabentypen: BGProcessingTask für langlaufende Operationen und BGAppRefreshTask für kurze Inhaltsaktualisierungen.
Wichtige Punkte
BGTaskScheduler ist ein Apple-System-Framework, das in iOS 13 eingeführt wurde und die Ausführung von Hintergrundaufgaben zentral verwaltet. Vor seiner Einführung verwendeten Entwickler UIApplication backgroundTasks, performFetch und Ereignisbehandlung in appDelegate, was zu Code-Fragmentierung und unvorhersehbarem Verhalten führte.
Das Framework arbeitet nach dem Prinzip der verzögerten Planung: Die App registriert Aufgaben mit eindeutigen Identifikatoren, und iOS bestimmt selbst den optimalen Zeitpunkt für ihre Ausführung. Das System berücksichtigt Akkustand, Benutzeraktivität, Netzwerkstatus und andere Faktoren.
Zu den Hauptfunktionen gehört die Arbeit sowohl mit kurzen als auch mit langen Hintergrundoperationen. Anders als AlarmManager unter Android garantiert BGTaskScheduler keine genaue Ausführungszeit — das System behält sich das Recht vor, eine Aufgabe zu verzögern, wenn die Bedingungen ungünstig sind.
BGTaskScheduler verwendet eine handlerbasierte Architektur. Die App registriert einen Handler für jeden Aufgabentyp, und das System ruft ihn auf, wenn der richtige Zeitpunkt gekommen ist. Das Framework selbst führt die Aufgabe nicht direkt aus — es benachrichtigt lediglich die App, dass es Zeit ist, sie auszuführen.
Die Registrierung beginnt mit der Deklaration des Aufgabenidentifikators in Info.plist über das BGTaskSchedulerPermittedIdentifiers-Array. Dann wird im App-Code die Methode registerHandler(forTaskWithIdentifier:) mit einem Handler-Closure aufgerufen.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// wird bei Zwangsbeendigung aufgerufen
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Nach der Registrierung muss die App die Aufgabenausführung explizit über submitTaskRequest anfordern. Die Anfrage enthält den Aufgabenidentifikator und das frühestmögliche Startdatum. Das System speichert die Anfrage und verarbeitet sie, wenn es die Bedingungen für geeignet hält.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Planungsfehler: \(error)")
}
BGTaskScheduler bietet zwei Haupttypen von Aufgaben, die jeweils für ihren eigenen Anwendungsfall konzipiert sind. Die Wahl des richtigen Typs beeinflusst direkt die Wahrscheinlichkeit einer erfolgreichen Aufgabenausführung durch das System.
BGAppRefreshTask ist für kurze Hintergrundinhaltsaktualisierungen konzipiert: Laden neuer Daten, Synchronisieren mit dem Server, Aktualisieren von Widgets. Die Ausführungszeit ist auf 30 Sekunden begrenzt, danach beendet das System die Aufgabe zwangsweise. Dieser Aufgabentyp wird häufiger ausgeführt als BGProcessingTask und hat eine höhere Priorität.
BGProcessingTask ist für längere Operationen konzipiert: Verarbeiten von Mediendateien, Indizieren von Core Data, Erstellen von Sicherungskopien. Die Aufgabe kann bis zu mehreren Minuten laufen, aber das System startet sie seltener und nur unter günstigen Bedingungen — mit Stromverbindung, stabilem WLAN und geringer Geräteauslastung.
| Parameter | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Zeitlimit | 30 Sekunden | mehrere Minuten |
| Starthäufigkeit | hoch | niedrig |
| Bedingungen | beliebig | Strom + WLAN |
| Erfordert Strom | nein | empfohlen |
| Beispiel | Feed aktualisieren | Video verarbeiten |
Die korrekte Registrierung ist eine zwingende Voraussetzung für die Funktion von BGTaskScheduler. Wenn eine Aufgabe nicht in Info.plist registriert ist, ignoriert das System jede Anfrage zu ihrer Ausführung.
Die Info.plist-Datei muss das BGTaskSchedulerPermittedIdentifiers-Array mit einer Liste von Zeichenfolgenidentifikatoren enthalten. Jeder Identifikator muss innerhalb der App eindeutig sein. Apple empfiehlt die Verwendung der umgekehrten Domain-Notation.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Verwenden Sie zum Planen einer Aufgabe die Methode submitTaskRequest. Wenn eine Aufgabe nicht mehr benötigt wird, kann sie über cancelTaskRequest oder cancelAllTaskRequests storniert werden. Das System storniert Aufgaben auch automatisch, wenn die App gelöscht oder Daten zurückgesetzt werden.
BGTaskScheduler bietet die Möglichkeit, den Status geplanter Aufgaben über getPendingTaskRequests zu verfolgen. Diese Methode gibt eine Liste aller aktiven Anfragen mit Informationen zu Typ, Identifikator und earliestBeginDate zurück. Für jede Anfrage können Sie prüfen, ob sie bereits abgeschlossen oder storniert wurde, und über eine Neuplanung entscheiden.
Es ist wichtig zu beachten, dass das System keinen direkten Rückruf über den Erfolg einer Hintergrundaufgabe bereitstellt — der Handler selbst muss das Ergebnis über die Aufgabeneigenschaften melden. setTaskCompleted ermöglicht es, eine Aufgabe als erfolgreich abgeschlossen zu markieren, wonach das System die nächste geplante Aufgabe dieses Typs starten kann. Wenn eine Aufgabe setTaskCompleted nicht aufruft, betrachtet das System sie als bei Zeitüberschreitung oder Zwangsbeendigung abgeschlossen.
Zur Diagnose wird empfohlen, OSLog im Handler zu verwenden und die Protokolle über die Console.app auf dem Mac anzuzeigen. Apple bietet auch das MetricKit-Tool zur Analyse der Leistung von Hintergrundaufgaben — es sammelt Daten zur Ausführungszeit, zum Energieverbrauch und zur Startfrequenz, die für die Optimierung verwendet werden können.
// Bestimmte Aufgabe stornieren
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Alle Aufgaben stornieren
BGTaskScheduler.shared.cancelAllTaskRequests()
// Geplante Aufgaben prüfen
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("\(requests.count) Aufgaben geplant")
}
BGTaskScheduler legt strenge Einschränkungen für die Hintergrundarbeit fest. Das System kann eine Aufgabe auf unbestimmte Zeit verzögern, wenn die Bedingungen ungünstig sind. Entwickler müssen verstehen, dass das Framework nicht für Echtzeitaufgaben gedacht ist.
Zu den wichtigsten Einschränkungen gehören: Das System garantiert keine Aufgabenausführung zur angegebenen Zeit, die maximale Anzahl gleichzeitiger Aufgaben ist begrenzt und der Energieverbrauch wird streng kontrolliert. Das Ausführen mehrerer Aufgaben hintereinander kann zu deren Zusammenführung oder Stornierung führen.
Um die Wahrscheinlichkeit der Ausführung zu erhöhen, wird empfohlen, earliestBeginDate nicht früher als 1 Stunde für BGProcessingTask und 15 Minuten für BGAppRefreshTask zu setzen. Es ist auch wichtig, expirationHandler zu behandeln — wenn eine Aufgabe ihr Zeitlimit nicht einhalten kann, ruft das System diesen Handler zur ordnungsgemäßen Beendigung auf. Die Neuplanung sollte innerhalb des Handlers selbst erfolgen, um einen kontinuierlichen Hintergrundarbeitszyklus aufrechtzuerhalten.
Eine weitere wichtige Einschränkung betrifft Netzwerkanfragen. BGTaskScheduler garantiert keine aktive Netzwerkverbindung während der Aufgabenausführung. Die App muss die Netzwerkverfügbarkeit eigenständig über NWPathMonitor prüfen und die Verarbeitung verschieben, wenn keine Verbindung besteht. Dies unterscheidet sich von Android JobScheduler, der eine Aufgabe nur aktivieren kann, wenn eine Verbindung zu einem bestimmten Netzwerktyp besteht. In der Praxis kombinieren Entwickler BGTaskScheduler oft mit Hintergrund-URL-Sitzungen von NSURLSession für zuverlässiges Datenladen.
Ab macOS Catalina ist BGTaskScheduler auch auf dem Mac verfügbar. Dies ermöglicht die Erstellung plattformübergreifender Hintergrundaufgaben für UIKit-Apps, die auf Apple Silicon ausgeführt werden. Auf watchOS hat das Framework eingeschränkte Funktionalität — nur kurze BGAppRefreshTask sind zum Aktualisieren von Komplikationen und Synchronisieren von Daten mit dem iPhone verfügbar. Entwickler sollten bei der Planung der Hintergrundarchitektur Plattformunterschiede berücksichtigen.
Apple stellt mehrere Tools zum Debuggen von BGTaskScheduler bereit. Der Befehl e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] in lldb startet eine Hintergrundaufgabe zwangsweise und umgeht dabei Systembeschränkungen. Xcode hat ein Simulate Background Fetch-Flag im Debug-Menü, das eine kurze Hintergrundaktualisierung emuliert. MetricKit wird für die Leistungsanalyse verwendet — es sammelt Informationen über Startfrequenz, Ausführungsdauer und Energieverbrauch jeder Aufgabe. Diese Daten helfen, die Planungshäufigkeit zu optimieren und den richtigen Aufgabentyp auszuwählen.
In der Praxis eignet sich BGTaskScheduler gut zum Aktualisieren von Widget-Daten, iCloud-Synchronisierung, Verarbeiten von Push-Benachrichtigungen mit Inhalten und Indizieren für die Spotlight-Suche. Es eignet sich nicht für Echtzeitanalysen, Chat-Anwendungen oder Aufgaben, die eine sofortige Ausführung erfordern.
Für ein vertieftes Studium von BGTaskScheduler empfiehlt Apple die offizielle WWDC-Dokumentation: Die Sitzung „Advances in Background Tasks“ (2020) behandelt die Migration von veralteten APIs, und „Background Tasks in Practice“ (2021) enthält reale Anwendungsfälle. Der Abschnitt Energy Efficiency Guide ist ebenfalls nützlich und beschreibt, wie das Framework in Apples gesamte Energiesparstrategie passt. Codebeispiele sind im offiziellen Apple Developer-Repository auf GitHub mit vollständigen Projekten für iOS und macOS verfügbar.
Häufig gestellte Fragen
Background Fetch war auf eine Hintergrundaufgabe pro App beschränkt und hatte keinen Prioritätsmechanismus. BGTaskScheduler unterstützt mehrere Aufgaben mit verschiedenen Typen, bietet eine einheitliche API und automatische Energieverwaltung.
Apple legt keine explizite Grenze für die Anzahl registrierter Identifikatoren fest, aber in der Praxis wird empfohlen, nicht mehr als 5–10 Aufgaben zu verwenden. Eine größere Anzahl verringert die Wahrscheinlichkeit, dass jede einzelne Aufgabe aufgrund von Wettbewerb um Systemressourcen ausgeführt wird.
Verwenden Sie zum Debuggen den Befehl e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] in lldb. Er startet eine Aufgabe zwangsweise und umgeht Systembeschränkungen. Das Xcode Simulate Background Fetch-Flag im Debug-Menü ist ebenfalls verfügbar.
Ja, BGTaskScheduler kann einen Prozess starten, selbst wenn die App vom Benutzer zwangsweise beendet wurde. Das System kann jedoch zusätzliche Verzögerungen anwenden, und nicht alle Aufgabentypen garantieren die Ausführung in diesem Szenario.
Das System ruft expirationHandler auf und signalisiert der Aufgabe, dass sie beendet werden muss. Ignoriert die App dieses Signal und arbeitet weiter, beendet iOS den Prozess zwangsweise. Danach kann das System die Priorität aller Hintergrundaufgaben der App herabsetzen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch