Background Fetch — az iOS mechanizmusa, amely időszakosan felébreszti az alkalmazást a háttérben friss tartalom letöltéséhez. A rendszer elemzi a felhasználó viselkedését és kiválasztja az optimális ablakokat a frissítéshez. A Apple, 2026 adatai szerint az alkalmazás 30 és 120 másodperc között kap a művelet végrehajtására, majd a rendszer felfüggeszti vagy befejezi a folyamatot.
Főbb pontok
Background Fetch — egy iOS API, amely lehetővé teszi az alkalmazás számára, hogy időszakosan friss adatokat kapjon a háttérben. Először iOS 7-ben mutatták be a Background App Refresh mechanizmussal együtt. A fő cél — hogy a tartalom naprakész legyen abban a pillanatban, amikor a felhasználó megnyitja az alkalmazást, anélkül hogy várnia kellene a betöltésre.
A Push értesítéseket a szerver kezdeményezi — jelet küld az eszközre, és a rendszer eldönti, hogy felébreszti-e az alkalmazást vagy sem. A Background Fetch-et maga az iOS kezdeményezi az eszköz használati mintái alapján. A Push alkalmasabb sürgős üzenetekhez, a Fetch — ütemezett tartalomfrissítéshez (hírek, közösségi médiacsatorna).
Background Fetch — az iOS egyik háttérvégrehajtási mechanizmusa. BGAppRefreshTask (iOS 13+) ugyanazt a feladatot végzi, de rugalmasabb ütemezéssel. Background Modes (audio, helymeghatározás) — folyamatos műveletekhez. Silent Push — szerver által kezdeményezett frissítés. A Fetch továbbra is releváns az iOS 12-t és alacsonyabb verziókat támogató projektek számára.
iOS gépi tanulási algoritmust használ az alkalmazás ébresztésének optimális időpontjának meghatározásához. A rendszer elemzi, hogy a felhasználó mikor nyitja meg általában az alkalmazást, mennyi ideig használja és milyen gyakran tér vissza. Ezen adatok alapján az iOS kiszámítja az ablakokat a Background Fetch számára.
Amikor a rendszer úgy dönt, hogy felébreszti az alkalmazást, meghívja az application(_:performFetchWithCompletionHandler:) metódust az AppDelegate-ben. Az alkalmazásnak minimális mennyiségű új adatot kell letöltenie és meg kell hívnia a completion handlert a három státusz egyikével: .newData (adatok letöltve), .noData (nincs új adat) vagy .failed (hiba). A státusz befolyásolja a jövőbeli ébresztések gyakoriságát.
A .newData státusz tájékoztatja a rendszert, hogy a frissítés hasznos volt — az iOS növelheti az ébresztések gyakoriságát. A .noData azt jelzi, hogy nincs adat — a gyakoriság változatlan marad vagy csökken. A .failed problémát jelez — a rendszer csökkenti a gyakoriságot, hogy ne merítse az akkumulátort. A hangsúlynak az őszinte státuszon kell lennie, nem a kényszerített .newData-n.
| Státusz | Jelentés | Hatás |
|---|---|---|
| .newData | Adatok sikeresen letöltve | Gyakoriság nőhet |
| .noData | Az ellenőrzés nem talált új adatot | Gyakoriság változatlan |
| .failed | Hálózati vagy szerverhiba | Gyakoriság csökken |
A Background Fetch engedélyezéséhez két lépést kell végrehajtani: aktiválni a capability-t Xcode-ban és beállítani a minimális intervallumot a kódban. A capability a Target — Signing & Capabilities — Background Modes — Background Fetch jelölőnégyzet bejelölésével található. E lépés nélkül a rendszer nem ébreszti fel az alkalmazást.
A UIApplication.shared.setMinimumBackgroundFetchInterval metódus beállítja a minimális időt másodpercben a Fetch hívások között. A UIApplication.backgroundFetchIntervalMinimum érték (körülbelül 15 perc) utasítja a rendszert, hogy olyan gyakran ébressze fel az alkalmazást, amilyen gyakran energiahatékony. Az intervallum beállítása az application(_:didFinishLaunchingWithOptions:) metódusban standard gyakorlat.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
A Background Fetch Xcode-ban történő engedélyezésekor automatikusan frissíti az Info.plist-et — hozzáadja a UIBackgroundModes kulcsot fetch értékkel. Ez egy kötelező lépés: enélkül az alkalmazás nem kapja meg a performFetchWithCompletionHandler hívást. A jelenlétet a P list Source vagy a Build Settings segítségével ellenőrizheti.
Tekintsük át a Background Fetch teljes implementációját egy híralkalmazáshoz. Az implementáció magában foglalja az adatok letöltését, gyorsítótárazást és a completion handler meghívását. A kód az AppDelegate-ben fut — az egyetlen helyen, ahol a rendszer fetch-et hív.
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()
}
A Background Fetch segítségével letöltött adatokat helyi tárolóba — CoreData, UserDefaults vagy File Manager — kell menteni. Az alkalmazás megnyitásakor az adatoknak már elérhetőnek kell lenniük. Használjon CoreData-t háttérkontextussal a szálbiztos íráshoz. Mentés után frissítse a UI-t a fő szálon.
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()
}
}
Teszthez használja a Simulator-t — válassza a Debug — Simulate Background Fetch menüpontot Xcode-ban. Fizikai eszközön várnia kell, amíg a rendszer úgy dönt, hogy végrehajtja a fetch-et. A gyorsításhoz beállíthatja a minimális intervallumot 1 percre, de a rendszer alacsony akkumulátorszintnél továbbra is figyelmen kívül hagyhatja.
A Background Fetch számos korlátozással rendelkezik, amelyeket fontos figyelembe venni az alkalmazás architektúrájának tervezésekor. A legfontosabb — a rendszer teljes mértékben szabályozza a hívások gyakoriságát, és a fejlesztő nem tudja garantálni azt. Még beállított minimális intervallum esetén is a rendszer órákig nem hívhat fetch-et.
A rendszer korlátozott időt biztosít az alkalmazásnak a feladat végrehajtására — általában akár 30 másodpercet. Ha az alkalmazás nem hívja meg a completion handlert ezen idő alatt, a rendszer kényszerítetten befejezi a folyamatot és csökkenti a jövőbeli ébresztések gyakoriságát. Minden hálózati kérésnek kompaktnak kell lennie — legfeljebb 1–2 hívásonként.
Az iOS figyelembe veszi az akkumulátor töltöttségi szintjét a Background Fetch ütemezésekor. 20% alatti szintnél az ébresztések gyakorisága csökken. Low Power Mode bekapcsolásakor a rendszer teljesen kikapcsolhatja a háttérfrissítéseket minden alkalmazás számára. A felhasználó a beállításokban egy adott alkalmazásra is kikapcsolhatja a Background App Refresh funkciót.
A Background Fetch-ből indított URLSession standard módban működik — háttér-munkamenetek támogatása nélkül. Nagy letöltésekhez használjon URLSession-t background configurationnel. A rendszer folytatja a letöltést a fetch befejezése után is, de a haladás nem lesz követve a következő ébresztésig.
iOS 13-tól kezdve az Apple a BGTaskScheduler-t ajánlja a Background Fetch helyettesítésére. A BGTaskScheduler rugalmasabb ütemezést, kétféle feladatot (refresh és processing) és a feladatok regisztrációját azonosítókkal biztosítja. A migráció több lépésből áll, és minden új projekt számára ajánlott.
Első lépés — határozza meg a feladatazonosítókat az Info.plist-ben a BGTaskSchedulerPermittedIdentifiers kulcs segítségével. Második — regisztrálja a feladatokat az AppDelegate-ben a BGTaskScheduler.shared.register segítségével. Harmadik — cserélje ki a performFetchWithCompletionHandler hívást a register-nek átadott handlerre. Negyedik — hívja meg a submit-et a feladat ütemezéséhez.
// Korábban (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// Migráció után (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)
A BGTaskScheduler több vezérlést biztosít: BGProcessingTask hosszú műveletekhez (akár 10 percig), végrehajtási feltételek a requiresNetworkConnectivity és requiresExternalPower segítségével, expiration handler a zökkenőmentes befejezéshez. A rendszer is elemzi az alkalmazás használatát, de a fejlesztő pontosabb követelményeket állíthat be.
Ha az alkalmazás támogatja az iOS 12-t és alacsonyabb verziókat, a Background Fetch marad az egyetlen lehetőség az időszakos frissítésre. A BGTaskScheduler csak iOS 13+-tól elérhető. Ebben az esetben használjon wrapper-t: ellenőrizze a BGTaskScheduler elérhetőségét az if #available(iOS 13, *) segítségével, és hívja meg a megfelelő API-t.
Gyakran Ismételt Kérdések
A pontos gyakoriság nincs dokumentálva, és a felhasználó viselkedésétől függ. A rendszer elemzi, hogy a felhasználó milyen gyakran nyitja meg az alkalmazást, és ennek megfelelően állítja be a gyakoriságot. Átlagosan aktív használat mellett a fetch óránként 1–3 alkalommal hívódhat meg. Ritka használat mellett — napi 1–2 alkalommal.
Ellenőrizze a három feltételt: Background Fetch capability be van kapcsolva Xcode-ban, be van állítva a minimumBackgroundFetchInterval, és a felhasználó nem kapcsolta ki a Background App Refresh funkciót az alkalmazás számára a beállításokban. Ellenőrizze azt is, hogy az eszköz nincs Low Power Mode-ban, és az akkumulátor szintje 20% felett van.
Background Fetch — régi API (iOS 7), BGAppRefreshTask — új API (iOS 13+). A BGAppRefreshTask több vezérlést biztosít: expiration handler, átütemezési lehetőség és állapotellenőrzés. A Background Fetch egyszerűbb implementálni, de kevésbé rugalmas. Az Apple a BGAppRefreshTask használatát ajánlja új projektekhez.
Nem ajánlott. Background Fetch időben korlátozott (akár 30 másodperc). Nagy letöltésekhez használjon URLSession-t background configurationnel — a rendszer folytatja a letöltést a fetch befejezése után is. Alternatíva — BGProcessingTask (iOS 13+), ahol akár 10 perc és töltési feltételek állnak rendelkezésre.
Igen, minden ébresztés energiát fogyaszt a processzor bekapcsolásához, a hálózati verem inicializálásához és az adatok letöltéséhez. Az iOS optimalizálja a gyakoriságot a hatás minimalizálása érdekében. Helyes implementációval — csak új adatok letöltése, a completion handler gyors meghívása — az akkumulátorra gyakorolt hatás minimális.
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is