Background Fetch ist ein iOS-Mechanismus, der die App regelmäßig im Hintergrund aufweckt, um neue Inhalte herunterzuladen. Das System analysiert das Benutzerverhalten und wählt optimale Fenster für die Aktualisierung aus. Laut Apple, 2026 erhält die App 30 bis 120 Sekunden für die Ausführung des Vorgangs, danach setzt das System den Prozess aus oder beendet ihn.
Die wichtigsten Punkte
Background Fetch ist eine iOS-API, die es der App ermöglicht, im Hintergrund regelmäßig neue Daten zu empfangen. Erstmals eingeführt in iOS 7 zusammen mit dem Background App Refresh-Mechanismus. Das Hauptziel ist, dass der Inhalt aktuell ist, wenn der Benutzer die App öffnet, ohne auf das Laden warten zu müssen.
Push-Benachrichtigungen werden vom Server initiiert — dieser sendet ein Signal an das Gerät, und das System entscheidet, ob die App geweckt wird. Background Fetch wird von iOS selbst basierend auf den Nutzungsmustern des Geräts initiiert. Push eignet sich besser für dringende Nachrichten, Fetch für geplante Inhaltsaktualisierungen (Nachrichten, Social-Media-Feed).
Background Fetch ist einer von mehreren Hintergrundausführungsmechanismen in iOS. BGAppRefreshTask (iOS 13+) führt dieselbe Aufgabe aus, jedoch mit flexiblerer Planung. Background Modes (Audio, Standort) dienen für kontinuierliche Operationen. Silent Push sind serverinitiierte Aktualisierungen. Fetch bleibt für Projekte relevant, die iOS 12 und älter unterstützen.
iOS verwendet einen maschinellen Lernalgorithmus, um den optimalen Zeitpunkt zum Aufwecken der App zu bestimmen. Das System analysiert, wann der Benutzer die App normalerweise öffnet, wie lange er sie nutzt und wie oft er zurückkehrt. Basierend auf diesen Daten berechnet iOS Fenster für Background Fetch.
Wenn das System beschließt, die App aufzuwecken, ruft es die Methode application(_:performFetchWithCompletionHandler:) im AppDelegate auf. Die App sollte eine minimale Menge neuer Daten laden und den Completion Handler mit einem von drei Status aufrufen: .newData (Daten geladen), .noData (keine neuen Daten) oder .failed (Fehler). Der Status beeinflusst die Häufigkeit zukünftiger Aufweckvorgänge.
Der Status .newData teilt dem System mit, dass die Aktualisierung nützlich war — iOS kann die Aufweckfrequenz erhöhen. .noData zeigt an, dass keine Daten vorhanden sind — die Frequenz bleibt gleich oder sinkt. .failed signalisiert ein Problem — das System reduziert die Frequenz, um Batterie zu sparen. Der Schwerpunkt sollte auf einem ehrlichen Status liegen, nicht auf dem Erzwingen von .newData.
| Status | Bedeutung | Auswirkung |
|---|---|---|
| .newData | Daten erfolgreich geladen | Frequenz kann steigen |
| .noData | Prüfung ergab keine neuen Daten | Frequenz bleibt gleich |
| .failed | Netzwerk- oder Serverfehler | Frequenz sinkt |
Um Background Fetch zu aktivieren, sind zwei Schritte erforderlich: Aktivieren Sie die Capability in Xcode und legen Sie das Mindestintervall im Code fest. Die Capability befindet sich unter Target — Signing & Capabilities — Background Modes — Aktivieren Sie das Kontrollkästchen Background Fetch. Ohne diesen Schritt wird das System die App nicht aufwecken.
Die Methode UIApplication.shared.setMinimumBackgroundFetchInterval legt die Mindestzeit in Sekunden zwischen Fetch-Aufrufen fest. Der Wert UIApplication.backgroundFetchIntervalMinimum (etwa 15 Minuten) teilt dem System mit, die App so oft wie energieeffizient aufzuwecken. Das Festlegen des Intervalls in application(_:didFinishLaunchingWithOptions:) ist Standardpraxis.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
Beim Aktivieren von Background Fetch in Xcode wird Info.plist automatisch aktualisiert — der Schlüssel UIBackgroundModes mit dem Wert fetch wird hinzugefügt. Dies ist ein obligatorischer Schritt: Ohne ihn erhält die App keinen performFetchWithCompletionHandler-Aufruf. Sie können dies über P list Source oder Build Settings überprüfen.
Betrachten wir eine vollständige Background Fetch-Implementierung für eine Nachrichten-App. Die Implementierung umfasst Datenladen, Caching und Aufruf des Completion Handlers. Der Code wird in AppDelegate ausgeführt — dem einzigen Ort, an dem das System fetch aufruft.
func application(
_ application: UIApplication,
performFetchWithCompletionHandler handler: @escaping (UIBackgroundFetchResult) -> Void
) {
let url = URL(string: "https://api.example.com/latest")!
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
handler(.failed)
return
}
do {
let articles = try JSONDecoder().decode([Article].self, from: data)
cacheArticles(articles)
handler(articles.isEmpty ? .noData : .newData)
} catch {
handler(.failed)
}
}.resume()
}
Nach dem Laden der Daten über Background Fetch müssen diese im lokalen Speicher gespeichert werden — CoreData, UserDefaults oder File Manager. Beim Öffnen der App sollten die Daten bereits verfügbar sein. Verwenden Sie CoreData mit einem Hintergrundkontext für threadsicheres Schreiben. Aktualisieren Sie nach dem Speichern die UI im Hauptthread.
func cacheArticles(_ articles: [Article]) {
let container = NSPersistentContainer(name: "AppModel")
container.performBackgroundTask { context in
articles.forEach { article in
let entity = ArticleEntity(context: context)
entity.id = Int64(article.id)
entity.title = article.title
entity.body = article.body
}
try? context.save()
}
}
Verwenden Sie zum Testen den Simulator — wählen Sie Debug — Simulate Background Fetch in Xcode. Auf einem physischen Gerät müssen Sie warten, bis das System entscheidet, einen Fetch durchzuführen. Zur Beschleunigung können Sie das Mindestintervall auf 1 Minute setzen, aber das System kann es bei niedrigem Akkustand ignorieren.
Background Fetch hat mehrere Einschränkungen, die bei der Gestaltung der App-Architektur zu beachten sind. Die wichtigste ist, dass das System die Aufruffrequenz vollständig kontrolliert und der Entwickler sie nicht garantieren kann. Selbst bei festgelegtem Mindestintervall kann das System stundenlang keinen Fetch aufrufen.
Das System weist der App begrenzte Zeit zur Ausführung der Aufgabe zu — normalerweise bis zu 30 Sekunden. Wenn die App den Completion Handler nicht innerhalb dieser Zeit aufruft, beendet das System den Prozess zwangsweise und reduziert die Häufigkeit zukünftiger Aufweckvorgänge. Alle Netzwerkanfragen sollten kompakt sein — nicht mehr als 1-2 pro Aufruf.
iOS berücksichtigt den Batterieladestand bei der Planung von Background Fetch. Bei einer Ladung unter 20% sinkt die Aufweckfrequenz. Bei aktiviertem Low Power Mode kann das System Hintergrundaktualisierungen für alle Apps vollständig deaktivieren. Der Benutzer kann Background App Refresh auch für eine bestimmte App in den Einstellungen deaktivieren.
Eine von Background Fetch gestartete URLSession arbeitet im Standardmodus — ohne Unterstützung für Hintergrundsitzungen. Für große Downloads verwenden Sie URLSession mit Hintergrundkonfiguration. Das System setzt den Download auch nach Abschluss des Fetch fort, aber der Fortschritt wird erst beim nächsten Aufwecken verfolgt.
Ab iOS 13 empfiehlt Apple BGTaskScheduler als Ersatz für Background Fetch. BGTaskScheduler bietet flexiblere Planung, zwei Aufgabentypen (Refresh und Processing) und Aufgabenregistrierung mit Identifikatoren. Die Migration umfasst mehrere Schritte und wird für alle neuen Projekte empfohlen.
Der erste Schritt ist die Definition von Aufgabenidentifikatoren in Info.plist über den Schlüssel BGTaskSchedulerPermittedIdentifiers. Der zweite ist die Registrierung von Aufgaben in AppDelegate über BGTaskScheduler.shared.register. Der dritte ist das Ersetzen des performFetchWithCompletionHandler-Aufrufs durch den an register übergebenen Handler. Der vierte ist das Aufrufen von submit zur Planung der Aufgabe.
// Vorher (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// Nach der Migration (BGTaskScheduler)
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.example.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
let request = BGAppRefreshTaskRequest(
identifier: "com.example.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
BGTaskScheduler bietet mehr Kontrolle: BGProcessingTask für langlaufende Operationen (bis zu 10 Minuten), Ausführungsbedingungen über requiresNetworkConnectivity und requiresExternalPower sowie einen Expiration Handler für kontrollierte Beendigung. Das System analysiert auch die App-Nutzung, aber der Entwickler kann präzisere Anforderungen festlegen.
Wenn die App iOS 12 und älter unterstützt, bleibt Background Fetch die einzige Option für regelmäßige Aktualisierungen. BGTaskScheduler ist nur ab iOS 13+ verfügbar. Verwenden Sie in diesem Fall einen Wrapper: Überprüfen Sie die Verfügbarkeit über if #available(iOS 13, *) und rufen Sie die entsprechende API auf.
Häufig gestellte Fragen
Die genaue Häufigkeit ist nicht dokumentiert und hängt vom Benutzerverhalten ab. Das System analysiert, wie oft der Benutzer die App öffnet, und passt die Häufigkeit entsprechend an. Im Durchschnitt kann Fetch bei aktiver Nutzung 1–3 Mal pro Stunde aufgerufen werden. Bei seltener Nutzung — 1–2 Mal pro Tag.
Überprüfen Sie drei Bedingungen: Background Fetch Capability ist in Xcode aktiviert, minimumBackgroundFetchInterval ist gesetzt, und der Benutzer hat Background App Refresh für die App in den Einstellungen nicht deaktiviert. Überprüfen Sie auch, dass das Gerät nicht im Low Power Mode ist und der Akkustand über 20% liegt.
Background Fetch ist die alte API (iOS 7), BGAppRefreshTask ist die neue API (iOS 13+). BGAppRefreshTask bietet mehr Kontrolle: Expiration Handler, Neuplanungsfähigkeit und Statusprüfung. Background Fetch ist einfacher zu implementieren, aber weniger flexibel. Apple empfiehlt die Verwendung von BGAppRefreshTask für neue Projekte.
Nicht empfohlen. Background Fetch ist zeitlich begrenzt (bis zu 30 Sekunden). Für große Downloads verwenden Sie URLSession mit Hintergrundkonfiguration — das System setzt den Download auch nach Abschluss des Fetch fort. Eine Alternative ist BGProcessingTask (iOS 13+), die bis zu 10 Minuten und Ladebedingungen erlaubt.
Ja, jedes Aufwecken verbraucht Energie zum Einschalten des Prozessors, Initialisieren des Netzwerkstacks und Laden von Daten. iOS optimiert die Häufigkeit, um die Auswirkungen zu minimieren. Bei korrekter Implementierung — nur neue Daten laden, schneller Completion Handler-Aufruf — ist der Einfluss auf die Batterie minimal.
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