Background Fetch — mecanismul iOS care trezește periodic aplicația în fundal pentru a încărca conținut proaspăt. Sistemul analizează comportamentul utilizatorului și selectează ferestrele optime pentru actualizare. Conform datelor Apple, 2026, aplicația primește între 30 și 120 de secunde pentru a executa operația, după care sistemul suspendă sau finalizează procesul.
Principalele puncte
Background Fetch — este API-ul iOS care permite aplicației să primească periodic date proaspete în fundal. A fost introdus pentru prima dată în iOS 7 împreună cu mecanismul Background App Refresh. Scopul principal — ca conținutul să fie actual în momentul deschiderii aplicației de către utilizator, fără a fi nevoie să aștepte încărcarea.
Notificările Push sunt inițiate de server — acesta trimite un semnal către dispozitiv, iar sistemul decide dacă să trezească aplicația sau nu. Background Fetch este inițiat de iOS însuși pe baza modelelor de utilizare a dispozitivului. Push este mai potrivit pentru mesaje urgente, Fetch — pentru actualizarea planificată a conținutului (știri, flux de rețea socială).
Background Fetch — unul dintre mai multe mecanisme de execuție în fundal în iOS. BGAppRefreshTask (iOS 13+) îndeplinește aceeași sarcină, dar cu o planificare mai flexibilă. Background Modes (audio, locație) — pentru operații continue. Silent Push — actualizare inițiată de server. Fetch rămâne relevant pentru proiectele cu suport pentru iOS 12 și versiuni anterioare.
iOS utilizează un algoritm de învățare automată pentru a determina momentul optim de trezire a aplicației. Sistemul analizează când utilizatorul deschide de obicei aplicația, cât timp o folosește și cât de des revine. Pe baza acestor date, iOS calculează ferestrele pentru Background Fetch.
Când sistemul decide să trezească aplicația, apelează metoda application(_:performFetchWithCompletionHandler:) în AppDelegate. Aplicația trebuie să încarce o cantitate minimă de date noi și să apeleze completion handler cu unul dintre cele trei statusuri: .newData (date încărcate), .noData (nu există date noi) sau .failed (eroare). Statusul influențează frecvența trezirilor viitoare.
Statusul .newData informează sistemul că actualizarea a fost utilă — iOS poate crește frecvența trezirilor. .noData spune că nu există date — frecvența rămâne aceeași sau scade. .failed semnalează o problemă — sistemul reduce frecvența pentru a nu consuma bateria. Accentul trebuie pus pe un status corect, nu pe .newData forțat.
| Status | Semnificație | Influență |
|---|---|---|
| .newData | Date încărcate cu succes | Frecvența poate crește |
| .noData | Verificarea nu a găsit date noi | Frecvența rămâne aceeași |
| .failed | Eroare de rețea sau server | Frecvența scade |
Pentru a activa Background Fetch trebuie efectuați doi pași: activați capability în Xcode și setați intervalul minim în cod. Capability se află în Target — Signing & Capabilities — Background Modes — bifați Background Fetch. Fără acest pas, sistemul nu va trezi aplicația.
Metoda UIApplication.shared.setMinimumBackgroundFetchInterval setează timpul minim în secunde între apelurile Fetch. Valoarea UIApplication.backgroundFetchIntervalMinimum (aproximativ 15 minute) indică sistemului să trezească aplicația cât de des este eficient energetic. Setarea intervalului în application(_:didFinishLaunchingWithOptions:) este o practică standard.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
La activarea Background Fetch în Xcode, acesta actualizează automat Info.plist — adaugă cheia UIBackgroundModes cu valoarea fetch. Acesta este un pas obligatoriu: fără el, aplicația nu va primi apelul performFetchWithCompletionHandler. Puteți verifica prezența prin P list Source sau Build Settings.
Să examinăm implementarea completă a Background Fetch pentru o aplicație de știri. Implementarea include încărcarea datelor, stocarea în cache și apelarea completion handler. Codul se execută în AppDelegate — singurul loc unde sistemul apelează fetch.
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()
}
După încărcarea datelor prin Background Fetch, acestea trebuie salvate în stocarea locală — CoreData, UserDefaults sau File Manager. La deschiderea aplicației, datele trebuie să fie deja disponibile. Utilizați CoreData cu un context de fundal pentru scriere sigură în fire paralele. După salvare, actualizați interfața utilizatorului în firul principal.
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()
}
}
Pentru testare utilizați Simulator — selectați Debug — Simulate Background Fetch în Xcode. Pe un dispozitiv fizic, trebuie să așteptați până când sistemul decide să execute fetch. Pentru accelerare, puteți seta intervalul minim la 1 minut, dar sistemul poate totuși să îl ignore la nivel scăzut al bateriei.
Background Fetch are o serie de limitări care trebuie luate în considerare la proiectarea arhitecturii aplicației. Principalul aspect — sistemul controlează complet frecvența apelurilor, iar dezvoltatorul nu o poate garanta. Chiar și cu intervalul minim setat, sistemul poate să nu apeleze fetch ore întregi.
Sistemul alocă aplicației timp limitat pentru executarea sarcinii — de obicei până la 30 de secunde. Dacă aplicația nu apelează completion handler în acest timp, sistemul încheie forțat procesul și reduce frecvența trezirilor viitoare. Toate cererile de rețea trebuie să fie compacte — nu mai mult de 1–2 per apel.
iOS ține cont de nivelul de încărcare al bateriei la planificarea Background Fetch. Când nivelul este sub 20%, frecvența trezirilor scade. Când modul Low Power Mode este activat, sistemul poate dezactiva complet actualizările de fundal pentru toate aplicațiile. Utilizatorul poate, de asemenea, să dezactiveze Background App Refresh pentru o anumită aplicație în setări.
URLSession pornită din Background Fetch funcționează în mod standard — fără suport pentru sesiuni de fundal. Pentru încărcări mari, utilizați URLSession cu background configuration. Sistemul va continua încărcarea chiar și după finalizarea fetch, dar progresul nu va fi urmărit până la următoarea trezire.
Începând cu iOS 13, Apple recomandă BGTaskScheduler ca înlocuitor pentru Background Fetch. BGTaskScheduler oferă o planificare mai flexibilă, două tipuri de sarcini (refresh și processing) și înregistrarea sarcinilor cu identificatori. Migrarea include mai mulți pași și este recomandată pentru toate proiectele noi.
Primul pas — stabiliți identificatorii sarcinilor în Info.plist prin cheia BGTaskSchedulerPermittedIdentifiers. Al doilea — înregistrați sarcinile în AppDelegate prin BGTaskScheduler.shared.register. Al treilea — înlocuiți apelul performFetchWithCompletionHandler cu handler-ul transmis către register. Al patrulea — apelați submit pentru planificarea sarcinii.
// Anterior (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// După migrare (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 oferă mai mult control: BGProcessingTask pentru operații lungi (până la 10 minute), condiții de execuție prin requiresNetworkConnectivity și requiresExternalPower, expiration handler pentru finalizare blândă. Sistemul analizează și el utilizarea aplicației, dar dezvoltatorul poate stabili cerințe mai precise.
Dacă aplicația suportă iOS 12 și versiuni anterioare, Background Fetch rămâne singura opțiune pentru actualizare periodică. BGTaskScheduler este disponibil doar de la iOS 13+. În acest caz, utilizați un wrapper: verificați disponibilitatea BGTaskScheduler prin if #available(iOS 13, *) și apelați API-ul corespunzător.
Întrebări frecvente
Frecvența exactă nu este documentată și depinde de comportamentul utilizatorului. Sistemul analizează cât de des utilizatorul deschide aplicația și ajustează frecvența în consecință. În medie, la utilizare activă, fetch poate fi apelat de 1–3 ori pe oră. La utilizare rară — de 1–2 ori pe zi.
Verificați trei condiții: Background Fetch capability este activată în Xcode, minimumBackgroundFetchInterval este setat, iar utilizatorul nu a dezactivat Background App Refresh pentru aplicație în setări. De asemenea, verificați că dispozitivul nu este în Low Power Mode și nivelul bateriei este peste 20%.
Background Fetch — API vechi (iOS 7), BGAppRefreshTask — API nou (iOS 13+). BGAppRefreshTask oferă mai mult control: expiration handler, posibilitatea de replanificare și verificare a statusului. Background Fetch este mai simplu de implementat, dar mai puțin flexibil. Apple recomandă utilizarea BGAppRefreshTask pentru proiecte noi.
Nu este recomandat. Background Fetch este limitat în timp (până la 30 de secunde). Pentru încărcări mari, utilizați URLSession cu background configuration — sistemul va continua încărcarea chiar și după finalizarea fetch. Alternativa — BGProcessingTask (iOS 13+), unde sunt disponibile până la 10 minute și condiții de încărcare.
Da, fiecare trezire consumă energie pentru pornirea procesorului, inițializarea stivei de rețea și încărcarea datelor. iOS optimizează frecvența pentru a minimiza impactul. Cu o implementare corectă — încărcarea doar a datelor noi, apelarea rapidă a completion handler — impactul asupra bateriei este minim.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și