Background Task: kulcsfogalmak, feladatok regisztrációja és végrehajtása háttérben

Szerző: IT Sectr Megjelenés: 2026-03-27 Olvasási idő: 10 perc

Background Task — iOS mechanizmus, amely lehetővé teszi az alkalmazás számára, hogy befejezze a megkezdett műveletet a háttérmódba való átlépés után. A rendszer korlátozott időt (legfeljebb 30 másodpercet) biztosít a feladat végrehajtására, majd az alkalmazás kényszerítve felfüggesztésre kerül. A Apple, 2026 szerint az expiration handler használata kötelező követelmény a háttérfeladat helyes befejezéséhez.

Főbb pontok

  • Background Task — iOS mechanizmus a műveletek befejezésére az alkalmazás háttérbe kerülése után.
  • beginBackgroundTask — a UIApplication kulcsmetódusa a háttérfeladat regisztrálásához.
  • Expiration handler — kódblokk, amelyet a rendszer hív meg a kiosztott idő lejártakor.
  • 30 másodperces korlátozás — szabványos végrehajtási idő, meghosszabbítás Background Modes segítségével.
  • UIApplication.shared.endBackgroundTask — kötelező hívás a feladat helyes befejezéséhez.

Mi az a Background Task iOS-ben?

A Background Task egy iOS szoftvermechanizmus, amely lehetővé teszi az alkalmazás számára, hogy meghosszabbítsa a végrehajtási időt a háttérmódba való átlépés után. Amikor a felhasználó minimalizálja az alkalmazást, a rendszer meghívja a UIApplicationDelegate.applicationDidEnterBackground metódust. Ha ebben a pillanatban egy kritikus művelet (adatmentés, kérelem küldése) fut, az alkalmazás kérhet további időt a beginBackgroundTask segítségével.

Miért van szükség Background Tasks-re

A Background Task használata nélkül az alkalmazás 3-5 másodperccel a háttérbe kerülés után kényszerítve felfüggesztésre kerül. Az összes befejezetlen művelet megszakad: az adatok nem mentődnek, a hálózati kérések megszakadnak, az állapotok elvesznek. A Background Task akár 30 másodpercet biztosít az alkalmazásnak ezen műveletek helyes befejezésére.

  • Állapot mentése — adatok írása CoreData-ba, UserDefaults-ba vagy fájlrendszerbe.
  • Hálózati kérések befejezése — válasz várása a szervertől és az eredmény feldolgozása.
  • Analitika küldése — események továbbítása az analitikai szerverre felfüggesztés előtt.
  • Erőforrások tisztítása — fájlleírók bezárása, memória felszabadítása.
  • Gyorsítótárazás — köztes eredmények mentése a következő indításkori visszaállításhoz.

Történelem és fejlődés

A beginBackgroundTask az iOS 4.0-ban jelent meg — az első kiadásban, amely támogatta a többfeladatos működést. Az iOS 4 előtt az alkalmazás teljesen bezáródott a Home gomb megnyomásakor. Az iOS 7-től megjelent a Background Fetch és az URLSession background configuration. Az iOS 13-tól kezdve az Apple a BGTaskScheduler-t ajánlja új projektekhez, de a beginBackgroundTask továbbra is releváns a rövid távú műveletekhez.

Hogyan működik a beginBackgroundTask: életciklus

A beginBackgroundTask a UIApplication metódusa, amely regisztrál egy feladatot és visszaad egy egyedi UIBackgroundTaskIdentifier azonosítót. A rendszer meghosszabbítja a háttérvégrehajtás időzítőjét. Az idő lejártakor az expiration handler meghívásra kerül, majd az alkalmazásnak meg kell hívnia az endBackgroundTask(identifier:) metódust a helyes befejezéshez.

Lépésről lépésre történő végrehajtás

1. lépés — az alkalmazás megkapja a didEnterBackground értesítést. 2. lépés — a beginBackgroundTask(expirationHandler:) meghívásra kerül. 3. lépés — a kritikus művelet (mentés, hálózati kérelem) végrehajtásra kerül. 4. lépés — befejezéskor az endBackgroundTask(identifier:) meghívásra kerül. Ha a művelet nem fejeződik be 30 másodpercen belül — a rendszer meghívja az expiration handlert, és az alkalmazásnak azonnal be kell fejeznie a feladatot.

swift
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
}

UIApplication.shared.backgroundTimeRemaining

A backgroundTimeRemaining tulajdonság visszaadja a háttérfeladat kényszerített befejezéséig hátralévő másodpercek számát. Az érték valós időben csökken. Ha az alkalmazás nincs a háttérben — DBL_MAX értéket ad vissza. Használja ezt a tulajdonságot a viselkedés igazításához: amikor kevesebb mint 5 másodperc van hátra, szakítsa meg a hosszú műveleteket és mentse az előrehaladást.

Több feladat

Az alkalmazás egyszerre több Background Task-ot is regisztrálhat. Minden feladat saját azonosítót kap. A teljes végrehajtási idő összeadódik — ha 3 feladat van regisztrálva, az alkalmazás akár 90 másodpercet is kaphat. A rendszer azonban korábban is befejezheti az alkalmazást, ha az erőforrások kimerültek vagy az akkumulátor-határ túllépésre került.

Expiration handler: kötelező befejezéskezelés

Az Expiration handler egy kódblokk, amelyet a rendszer hív meg a háttérfeladatra kiosztott idő lejártakor. Az expiration handler megléte az Apple kötelező követelménye. Enélkül az alkalmazást a rendszer kényszerítve befejezheti, és az adatok elveszhetnek.

Mi legyen az expiration handler-ben

Az expiration handler-nek minimális műveleteket kell végrehajtania az alkalmazás állapotának mentéséhez: mentse az aktuális adatokat állandó tárhelyre, hívja meg a endBackgroundTask metódust a megfelelő azonosítóval, és állítsa az azonosítót .invalid értékre. Az expiration handler-en belül tilos új hosszú műveleteket indítani — a végrehajtási idő 1-2 másodpercre korlátozott.

swift
func handleExpiration() {
    // Előrehaladás mentése
    saveProgressToUserDefaults()

    // Aktív hálózati kérések megszakítása
    currentTask?.cancel()

    // Background Task befejezése
    UIApplication.shared.endBackgroundTask(backgroundTaskID)
    backgroundTaskID = .invalid
}

// Regisztráció expiration handler-rel
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
    withName: "SaveDocument",
    expirationHandler: handleExpiration
)

Hibák az expiration handler használatakor

A leggyakoribb hiba a endBackgroundTask meghívásának elmulasztása az expiration handler-en belül. Ebben az esetben a rendszer továbbra is aktívnak tekinti a feladatot, az alkalmazás nem megy Suspended állapotba, és az akkumulátor lemerül. A második hiba hosszú műveletek indítása az expiration handler-en belül. A rendszer befejezheti az alkalmazást azok befejezése előtt, és az adatok elvesznek.

A hátralévő idő ellenőrzése

Az expiration handler-ben a végrehajtási idő kritikusan rövid — általában kevesebb mint 1 másodperc. Ezért a handler-en belül nem végezhetők: összetett számítások, hálózati kérések, nagy mennyiségű adat írása CoreData-ba. Csak atomi műveletek: egy kulcs írása UserDefaults-ba, állapotjelző beállítása, endBackgroundTask meghívása.

Background Task kódpéldák Swift-ben

Nézzük meg a Background Task teljes implementációját egy dokumentum mentésére, amikor az alkalmazás a háttérbe kerül. A példa tartalmazza a feladat regisztrálását, a művelet végrehajtását a hátralévő idő ellenőrzésével és a helyes befejezést az endBackgroundTask segítségével.

Dokumentum mentése előrehaladással

A háttérbe kerüléskor az alkalmazás elindítja egy nagy dokumentum mentését. A Background Task akár 30 másodpercet biztosít a műveletre. Ha az idő lejár — az expiration handler elmenti a köztes eredményeket. A mentés befejezése után az endBackgroundTask meghívásra kerül az erőforrások felszabadításához.

swift
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
    }
}

Adatok küldése a szerverre

A háttérben végzett hálózati kérések különös figyelmet igényelnek — az expiration handler megszakíthatja a kérést a válasz megérkezése előtt. Használja az URLSession-t dataTask-kal, és ellenőrizze a backgroundTimeRemaining értéket küldés előtt. Ha kevesebb mint 5 másodperc van hátra — halassza el a küldést az alkalmazás következő ébredéséig.

swift
func sendCriticalData(data: Data) {
    backgroundTaskID = UIApplication.shared.beginBackgroundTask {
        // Adatok mentése újraküldéshez
        saveForRetry(data)
        self.endBackgroundTask()
    }

    let task = URLSession.shared.dataTask(with: request) { _, _, error in
        if error != nil {
            saveForRetry(data)
        }
        self.endBackgroundTask()
    }
    task.resume()
}

A hátralévő idő monitorozása

Hosszú műveletek esetén figyelje a UIApplication.shared.backgroundTimeRemaining értékét. Ha az érték a küszöb (10 másodperc) alá csökken, szakítsa meg az aktuális műveletet és indítsa el a köztes eredmények mentését. Ez lehetővé teszi a munka helyes befejezését az expiration handler kényszerített meghívása előtt.

Background Task használatának legjobb gyakorlatai

A Background Task egy hatékony mechanizmus, de helytelen használata akkumulátor- és teljesítményproblémákhoz vezet. Az Apple ajánlásainak és a közösség által bevált gyakorlatoknak a követése segít elkerülni a tipikus hibákat és biztosítani az alkalmazás stabil működését.

A végrehajtási idő minimalizálása

Fejezze be a Background Task-ot a lehető leggyorsabban. A háttérvégrehajtás minden másodperce akkumulátor-energiát fogyaszt. Optimális idő — kevesebb mint 5 másodperc. Ha a művelet tovább tart — fontolja meg a BGTaskScheduler vagy a Background Modes használatát. Ne hosszabbítsa meg mesterségesen a feladatot beginBackgroundTask hívásokkal valós szükség nélkül.

Az azonosítók helyes használata

Tárolja a UIBackgroundTaskIdentifier értéket egy osztály vagy struktúra tulajdonságaként. Soha ne adja át globális változóként — ez konfliktusokhoz vezet több feladat esetén. Állítsa az azonosítót .invalid értékre az endBackgroundTask meghívása után a kettős befejezés megelőzésére.

Background Task tesztelése

A Xcode Simulator-ban kapcsolja az alkalmazást háttérbe a Home gombbal (Command + Shift + H). Használja a Debug — Simulate Background Fetch funkciót a háttér-ébredés teszteléséhez. Az idő lejártának szimulálásához állítsa be a BACKGROUND_TASK_SIMULATE_EXPIRATION = YES környezeti változót — az expiration handler 5 másodperc után kerül meghívásra.

swift
// Hátralévő idő ellenőrzése a művelet megkezdése előtt
let remaining = UIApplication.shared.backgroundTimeRemaining
guard remaining > 10.0 else {
    // Nincs elég idő — feladat elhalasztása
    scheduleForNextLaunch()
    return
}

// Művelet végrehajtása időellenőrzéssel
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
    saveProgress()
    self.endBackgroundTask()
}

Kerülje a retain cycle-öket

Az expiration handler elkapja a self értéket — ez retain cycle-t hozhat létre, ha a backgroundTaskID ugyanazon objektum tulajdonságaként van tárolva. Használjon [weak self]-et a lezárásban, vagy tárolja az azonosítót külön. A retain cycle memóriaszivárgáshoz vezet — az objektum nem szabadul fel az alkalmazás befejezéséig.

Background Task vs BGTaskScheduler: megközelítések összehasonlítása

Az iOS 13 megjelenésével az Apple bemutatta a BGTaskScheduler-t — a régi Background Task API modern helyettesítőjét. Mindkét mechanizmus hasonló feladatokat old meg, de a BGTaskScheduler nagyobb kontrollt és rugalmasságot biztosít. A különbségek megértése segít kiválasztani a megfelelő eszközt az adott forgatókönyvhöz.

JellemzőBackground TaskBGTaskScheduler
iOS verzió4.0+13.0+
Max. idő30 másodperc30 mp / 10 perc (processing)
IndításdidEnterBackgroundÜtemezés + rendszer
Végrehajtás garanciájaCsak háttérbe kerüléskorA rendszer számára alkalmas időben
Expiration handlerIgen, kötelezőIgen, a task.expirationHandler segítségével
InternetIndításkor szükségesElérhető a requiresNetworkConnectivity-n keresztül
TöltésNem szükségesOpcionális processing esetén

Mikor használjuk a Background Task-ot

A beginBackgroundTask olyan rövid távú műveletekhez alkalmas, amelyeket azonnal végre kell hajtani a háttérbe kerüléskor: állapot mentése, hálózati kérelem befejezése, adatok gyorsítótárazása. Az API egyszerű, és nem igényel Info.plist konfigurációt vagy azonosítók regisztrálását. Ideális a 10 másodpercnél rövidebb műveletekhez.

Mikor használjuk a BGTaskScheduler-t

A BGTaskScheduler olyan feladatokhoz alkalmas, amelyek bármikor végrehajthatók: időszakos szinkronizáció, gyorsítótár-tisztítás, widgetek frissítése. A rendszer maga választja ki az optimális időpontot, figyelembe véve a felhasználó viselkedését és az akkumulátor állapotát. Hosszú műveletekhez (akár 10 percig) használja a BGProcessingTask-ot.

Közös használat

Mindkét API használható egy alkalmazásban. Background Task — azonnali műveletekhez a háttérbe kerüléskor (piszkozat mentése). BGTaskScheduler — ütemezett frissítésekhez (szinkronizáció 6 óránként). A felelősségek szétválasztása lehetővé teszi az adatok helyes mentésének és az energiahatékony háttérszolgáltatásnak a garantálását.

Gyakran ismételt kérdések

Meghívható-e a beginBackgroundTask a didEnterBackground-en kívül?

Igen, a beginBackgroundTask az alkalmazás működése során bármikor meghívható. Azonban a rendszer általi idő kiosztása csak a háttérbe kerülés után kezdődik. Ha az alkalmazás az előtérben van, a beginBackgroundTask hívásának nincs hatása — a backgroundTimeRemaining DBL_MAX értéket ad vissza, és a feladat a háttérbe kerüléskor aktiválódik.

Mi történik, ha nem hívják meg az endBackgroundTask-ot?

Ha az endBackgroundTask nem kerül meghívásra, a rendszer továbbra is aktívnak tekinti az alkalmazást a háttérben. 30 másodperc után az expiration handler meghívásra kerül, de ha abban sincs endBackgroundTask — az alkalmazás a memóriában marad, fogyasztva az akkumulátort. iOS 13+ esetén a rendszer 3 perc után kényszerítve befejezi az ilyen alkalmazást.

Hogyan növelhető a Background Task ideje 30 másodperc fölé?

A szabványos idő 30 másodperc. Növelése csak Background Modes segítségével lehetséges: Audio (lejátszás), Location (helymeghatározás), Bluetooth (BLE). Vagy a BGProcessingTask (iOS 13+) segítségével — akár 10 perc töltés és Wi-Fi mellett. A beginBackgroundTask önmagában nem biztosít módot a korlát növelésére.

Működik a Background Task iPad-en?

Igen, az iPadOS teljes mértékben támogatja a beginBackgroundTask-ot az iOS-szel azonos korlátozásokkal. Stage Manager-rel rendelkező iPad-en az alkalmazás tovább maradhat a memóriában — a rendszer ritkábban függeszti fel az alkalmazásokat a nagyobb RAM-mennyiség miatt. De a 30 másodperces korlát a háttérfeladatra továbbra is érvényben marad.

Hogyan lehet hibakeresni a Background Task-ot valós eszközön?

Csatlakoztassa az eszközt a Xcode-hoz, indítsa el az alkalmazást, minimalizálja — a konzolban megjelennek a rendszernaplók. Használja a sysdiagnose funkciót részletes naplók gyűjtéséhez: kényszerítse a sysdiagnose-t az eszközről (Volume Up + Down + Power). A Xcode Debug Navigator-ban kövesse nyomon a háttérfeladatok aktivitását.

Összefoglalás

  • Background Task — iOS mechanizmus a műveletek befejezésére a háttérbe kerülés után, elérhető az iOS 4.0 óta.
  • beginBackgroundTask — a UIApplication metódusa, amely regisztrálja a feladatot és visszaad egy azonosítót annak befejezéséhez.
  • Expiration handler — kötelező kódblokk, amelyet a rendszer hív meg a 30 másodperces korlát lejártakor.
  • endBackgroundTask — kötelező hívás a feladat helyes befejezéséhez; nélküle az alkalmazás a memóriában marad.
  • BGTaskScheduler — modern alternatíva (iOS 13+) ütemezéssel, két feladattípussal és végrehajtási feltételekkel.
  • backgroundTimeRemaining — tulajdonság a hátralévő idő ellenőrzéséhez és a feladat viselkedésének igazításához.
  • Használja a Background Task-ot azonnali rövid távú műveletekhez és a BGTaskScheduler-t ütemezett háttérfrissítésekhez az új projektekben.

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.

Projekt megbeszélése

Olvassa el is