Background Task ist ein iOS-Mechanismus, der es einer Anwendung ermöglicht, einen Vorgang nach dem Übergang in den Hintergrund abzuschließen. Das System weist eine begrenzte Zeit (bis zu 30 Sekunden) für die Ausführung der Aufgabe zu, danach wird die Anwendung zwangsweise ausgesetzt. Laut Apple, 2026 ist die Verwendung eines Expiration Handlers eine zwingende Voraussetzung für den korrekten Abschluss einer Hintergrundaufgabe.
Wichtige Punkte
Background Task ist ein programmierbarer iOS-Mechanismus, der es einer Anwendung ermöglicht, die Ausführungszeit nach dem Übergang in den Hintergrund zu verlängern. Wenn der Benutzer die Anwendung minimiert, ruft das System UIApplicationDelegate.applicationDidEnterBackground auf. Wenn zu diesem Zeitpunkt ein kritischer Vorgang ausgeführt wird (Daten speichern, eine Anfrage senden), kann die Anwendung über beginBackgroundTask zusätzliche Zeit anfordern.
Ohne Verwendung von Background Task wird die Anwendung 3–5 Sekunden nach dem Wechsel in den Hintergrund zwangsweise ausgesetzt. Alle unvollständigen Vorgänge werden unterbrochen: Daten werden nicht gespeichert, Netzwerkanfragen werden abgebrochen, Zustände gehen verloren. Background Task gibt der Anwendung bis zu 30 Sekunden, um diese Vorgänge ordnungsgemäß abzuschließen.
beginBackgroundTask erschien in iOS 4.0 — der ersten Version mit Multitasking-Unterstützung. Vor iOS 4 wurde die Anwendung beim Drücken der Home-Taste vollständig beendet. iOS 7 führte Background Fetch und URLSession-Hintergrundkonfiguration ein. Ab iOS 13 empfiehlt Apple BGTaskScheduler für neue Projekte, aber beginBackgroundTask bleibt für kurzfristige Vorgänge relevant.
beginBackgroundTask ist eine UIApplication-Methode, die eine Aufgabe registriert und eine eindeutige UIBackgroundTaskIdentifier zurückgibt. Das System erhöht den Hintergrundausführungs-Timer. Wenn die Zeit abläuft, wird der Expiration Handler aufgerufen, danach muss die Anwendung endBackgroundTask(identifier:) aufrufen, um die Aufgabe korrekt abzuschließen.
Schritt 1 — die Anwendung erhält die didEnterBackground-Benachrichtigung. Schritt 2 — beginBackgroundTask(expirationHandler:) wird aufgerufen. Schritt 3 — der kritische Vorgang (Speicherung, Netzwerkanfrage) wird ausgeführt. Schritt 4 — bei Abschluss wird endBackgroundTask(identifier:) aufgerufen. Wenn der Vorgang nicht innerhalb von 30 Sekunden abgeschlossen wird, ruft das System den Expiration Handler auf, und die Anwendung muss die Aufgabe sofort beenden.
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
}
Die Eigenschaft backgroundTimeRemaining gibt die Anzahl der Sekunden zurück, die verbleiben, bevor die Hintergrundaufgabe zwangsweise beendet wird. Der Wert nimmt in Echtzeit ab. Wenn die Anwendung nicht im Hintergrund ist, wird DBL_MAX zurückgegeben. Verwenden Sie diese Eigenschaft, um das Verhalten anzupassen: Wenn weniger als 5 Sekunden verbleiben, unterbrechen Sie langlaufende Vorgänge und speichern Sie den Fortschritt.
Eine Anwendung kann mehrere Background Tasks gleichzeitig registrieren. Jede Aufgabe erhält eine eigene Kennung. Die gesamte Ausführungszeit ist kumulativ — wenn 3 Aufgaben registriert sind, kann die Anwendung bis zu 90 Sekunden erhalten. Das System kann die Anwendung jedoch vorzeitig beenden, wenn Ressourcen erschöpft sind oder das Batterielimit überschritten wird.
Expiration Handler ist ein Codeblock, den das System aufruft, wenn die für die Hintergrundaufgabe zugewiesene Zeit abläuft. Das Vorhandensein eines Expiration Handlers ist eine zwingende Anforderung von Apple. Ohne ihn kann die Anwendung vom System zwangsweise beendet werden und Daten können verloren gehen.
Der Expiration Handler muss minimale Aktionen ausführen, um den Anwendungszustand zu sichern: aktuelle Daten im persistenten Speicher speichern, endBackgroundTask mit der entsprechenden Kennung aufrufen und die Kennung auf .invalid setzen. Innerhalb des Expiration Handlers ist es verboten, neue langlaufende Vorgänge zu starten — die Ausführungszeit ist auf 1–2 Sekunden begrenzt.
func handleExpiration() {
// Ausführungsfortschritt speichern
saveProgressToUserDefaults()
// Aktive Netzwerkanfragen abbrechen
currentTask?.cancel()
// Background Task beenden
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
// Registrierung mit Expiration Handler
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
withName: "SaveDocument",
expirationHandler: handleExpiration
)
Der häufigste Fehler ist, endBackgroundTask nicht innerhalb des Expiration Handlers aufzurufen. In diesem Fall betrachtet das System die Aufgabe weiterhin als aktiv, die Anwendung wechselt nicht in den Suspended-Zustand und der Akku entlädt sich. Der zweite Fehler ist das Starten langlaufender Vorgänge innerhalb des Expiration Handlers. Das System kann die Anwendung beenden, bevor diese abgeschlossen sind, und Daten gehen verloren.
Im Expiration Handler ist die Ausführungszeit kritisch begrenzt — typischerweise weniger als 1 Sekunde. Daher können innerhalb des Handlers nicht ausgeführt werden: komplexe Berechnungen, Netzwerkanfragen, Schreiben großer Datenmengen in CoreData. Nur atomare Operationen: Schreiben eines einzelnen Schlüssels in UserDefaults, Setzen einer Zustandsmarkierung, Aufruf von endBackgroundTask.
Sehen wir uns eine vollständige Background Task-Implementierung zum Speichern eines Dokuments an, wenn die App in den Hintergrund geht. Das Beispiel umfasst Aufgabenregistrierung, Ausführung des Vorgangs mit Überprüfung der verbleibenden Zeit und ordnungsgemäßen Abschluss über endBackgroundTask.
Beim Wechsel in den Hintergrund initiiert die Anwendung das Speichern eines großen Dokuments. Background Task bietet bis zu 30 Sekunden für den Vorgang. Wenn die Zeit abläuft, speichert der Expiration Handler Zwischenergebnisse. Nach Abschluss des Speichervorgangs wird endBackgroundTask aufgerufen, um Ressourcen freizugeben.
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
}
}
Netzwerkanfragen im Hintergrund erfordern besondere Aufmerksamkeit — der Expiration Handler kann die Anfrage unterbrechen, bevor eine Antwort eingeht. Verwenden Sie URLSession mit dataTask und überprüfen Sie backgroundTimeRemaining vor dem Senden. Wenn weniger als 5 Sekunden verbleiben, verschieben Sie das Senden bis zum nächsten Aufwachen der App.
func sendCriticalData(data: Data) {
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
// Daten für erneutes Senden speichern
saveForRetry(data)
self.endBackgroundTask()
}
let task = URLSession.shared.dataTask(with: request) { _, _, error in
if error != nil {
saveForRetry(data)
}
self.endBackgroundTask()
}
task.resume()
}
Überwachen Sie bei langlaufenden Vorgängen UIApplication.shared.backgroundTimeRemaining. Wenn der Wert unter einen Schwellenwert (10 Sekunden) fällt, unterbrechen Sie den aktuellen Vorgang und beginnen Sie mit dem Speichern von Zwischenergebnissen. Dies ermöglicht einen ordnungsgemäßen Abschluss, bevor der Expiration Handler zwangsweise aufgerufen wird.
Background Task ist ein leistungsstarker Mechanismus, aber seine unsachgemäße Verwendung führt zu Batterie- und Leistungsproblemen. Die Befolgung der Apple-Empfehlungen und bewährter Community-Praktiken hilft, häufige Fehler zu vermeiden und einen stabilen Anwendungsbetrieb zu gewährleisten.
Schließen Sie die Background Task so schnell wie möglich ab. Jede Sekunde der Hintergrundausführung verbraucht Akkuleistung. Optimale Zeit — weniger als 5 Sekunden. Wenn der Vorgang länger dauert, erwägen Sie die Verwendung von BGTaskScheduler oder Background Modes. Verlängern Sie die Aufgabe nicht künstlich durch beginBackgroundTask-Aufrufe ohne tatsächlichen Bedarf.
Speichern Sie UIBackgroundTaskIdentifier als Eigenschaft einer Klasse oder Struktur. Übergeben Sie es niemals als globale Variable — dies führt zu Konflikten bei mehreren Aufgaben. Setzen Sie die Kennung nach dem Aufruf von endBackgroundTask auf .invalid, um einen doppelten Abschluss zu verhindern.
Wechseln Sie im Xcode-Simulator über die Home-Taste (Command + Shift + H) in den Hintergrund. Verwenden Sie Debug — Simulate Background Fetch zum Testen des Hintergrundaufwachens. Um den Zeitablauf zu simulieren, setzen Sie die Umgebungsvariable BACKGROUND_TASK_SIMULATE_EXPIRATION = YES — der Expiration Handler wird innerhalb von 5 Sekunden aufgerufen.
// Verbleibende Zeit vor Operationsbeginn prüfen
let remaining = UIApplication.shared.backgroundTimeRemaining
guard remaining > 10.0 else {
// Nicht genug Zeit — Aufgabe verschieben
scheduleForNextLaunch()
return
}
// Operation mit Zeitkontrolle ausführen
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
saveProgress()
self.endBackgroundTask()
}
Der Expiration Handler erfasst self — dies kann einen Retain-Zyklus erzeugen, wenn backgroundTaskID als Eigenschaft desselben Objekts gespeichert ist. Verwenden Sie [weak self] im Closure oder speichern Sie die Kennung separat. Ein Retain-Zyklus führt zu einem Speicherleck — das Objekt wird erst freigegeben, wenn die Anwendung beendet wird.
Mit der Veröffentlichung von iOS 13 führte Apple BGTaskScheduler ein — einen modernen Ersatz für die alte Background Task API. Beide Mechanismen lösen ähnliche Aufgaben, aber BGTaskScheduler bietet mehr Kontrolle und Flexibilität. Das Verständnis der Unterschiede hilft bei der Auswahl des richtigen Werkzeugs für ein bestimmtes Szenario.
| Merkmal | Background Task | BGTaskScheduler |
|---|---|---|
| iOS-Version | 4.0+ | 13.0+ |
| Max. Zeit | 30 Sekunden | 30 s / 10 Min. (processing) |
| Initiiert durch | didEnterBackground | Planung + System |
| Ausführungsgarantie | Nur beim Wechsel in den Hintergrund | Zu jeder für das System passenden Zeit |
| Expiration Handler | Ja, obligatorisch | Ja, über task.expirationHandler |
| Internet | Beim Start erforderlich | Verfügbar über requiresNetworkConnectivity |
| Laden | Nicht erforderlich | Optional für processing |
beginBackgroundTask eignet sich für kurzfristige Vorgänge, die sofort beim Wechsel in den Hintergrund ausgeführt werden müssen: Zustand speichern, Netzwerkanfrage abschließen, Daten zwischenspeichern. Die API ist einfach und erfordert keine Info.plist-Konfiguration oder Kennungsregistrierung. Ideal für Vorgänge, die weniger als 10 Sekunden dauern.
BGTaskScheduler eignet sich für Aufgaben, die zu jeder passenden Zeit ausgeführt werden können: periodische Synchronisierung, Cache-Bereinigung, Widget-Aktualisierungen. Das System selbst wählt den optimalen Zeitpunkt unter Berücksichtigung des Benutzerverhaltens und des Batteriezustands. Für langlaufende Vorgänge (bis zu 10 Minuten) verwenden Sie BGProcessingTask.
Beide APIs können in derselben Anwendung verwendet werden. Background Task — für sofortige Vorgänge beim Wechsel in den Hintergrund (Speichern eines Entwurfs). BGTaskScheduler — für geplante Aktualisierungen (Synchronisierung alle 6 Stunden). Die Aufgabentrennung gewährleistet ordnungsgemäße Datenspeicherung und energieeffiziente Hintergrundwartung.
Häufig gestellte Fragen
Ja, beginBackgroundTask kann zu jedem Zeitpunkt der Anwendungsausführung aufgerufen werden. Die Systemzeit-Zuteilung beginnt jedoch erst nach dem Übergang in den Hintergrund. Wenn sich die Anwendung im Vordergrund befindet, hat der Aufruf von beginBackgroundTask keine Auswirkung — backgroundTimeRemaining gibt DBL_MAX zurück, und die Aufgabe wird beim Wechsel in den Hintergrund aktiviert.
Wenn endBackgroundTask nicht aufgerufen wird, betrachtet das System die Anwendung weiterhin als aktiv im Hintergrund. Nach 30 Sekunden wird der Expiration Handler aufgerufen, aber wenn auch ihm endBackgroundTask fehlt, bleibt die Anwendung im Speicher und entlädt den Akku. In iOS 13+ beendet das System eine solche Anwendung nach 3 Minuten zwangsweise.
Die Standardzeit beträgt 30 Sekunden. Sie kann nur über Background Modes verlängert werden: Audio (Wiedergabe), Standort (Geolokalisierung), Bluetooth (BLE). Oder über BGProcessingTask (iOS 13+) — bis zu 10 Minuten mit Ladung und Wi-Fi. beginBackgroundTask selbst bietet keine Möglichkeit, das Limit zu erhöhen.
Ja, iPadOS unterstützt beginBackgroundTask vollständig mit denselben Einschränkungen wie iOS. Auf dem iPad mit Stage Manager kann die Anwendung länger im Speicher bleiben — das System setzt Anwendungen aufgrund des größeren RAM seltener aus. Das 30-Sekunden-Limit für Hintergrundaufgaben bleibt jedoch bestehen.
Verbinden Sie das Gerät mit Xcode, starten Sie die Anwendung und minimieren Sie sie — Systemprotokolle erscheinen in der Konsole. Verwenden Sie sysdiagnose zum Sammeln detaillierter Protokolle: Lösen Sie sysdiagnose vom Gerät aus (Lautstärke hoch + Lautstärke runter + Ein/Aus). Im Xcode Debug Navigator überwachen Sie die Aktivität von Hintergrundaufgaben.
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