BGTaskScheduler — az Apple keretrendszere a háttérfeladatok ütemezésére és végrehajtására iOS 13 és újabb verziókban. Felváltotta az elavult Background Fetch és performFetch rendszereket, egységes API-t biztosítva a háttérműveletekhez. A Apple Developer Documentation, 2026 szerint a keretrendszer két típusú feladatot foglal magában: BGProcessingTask a hosszú idejű műveletekhez és BGAppRefreshTask a rövid tartalomfrissítésekhez.
Főbb pontok
BGTaskScheduler — az Apple rendszerkeretrendszere, amelyet iOS 13-ban vezettek be, és központosítottan kezeli a háttérfeladatok végrehajtását. Megjelenése előtt a fejlesztők a UIApplication backgroundTasks, performFetch és eseménykezelést használtak az appDelegate-ben, ami kódtöredezettséghez és kiszámíthatatlan viselkedéshez vezetett.
A keretrendszer a késleltetett ütemezés elvén működik: az alkalmazás egyedi azonosítókkal regisztrálja a feladatokat, az iOS pedig maga határozza meg a végrehajtásuk optimális pillanatát. A rendszer figyelembe veszi az akkumulátor töltési szintjét, a felhasználói aktivitást, a hálózati állapotot és más tényezőket.
Fő lehetőségek magukban foglalják a munkát mind rövid, mind hosszú háttérműveletekkel. Az Android AlarmManager-től eltérően a BGTaskScheduler nem garantálja a pontos végrehajtási időt — a rendszer fenntartja a jogot a feladat elhalasztására, ha a körülmények kedvezőtlenek.
BGTaskScheduler handler-alapú architektúrát használ. Az alkalmazás minden feladattípushoz regisztrál egy handlert, és a rendszer akkor hívja meg, amikor eljön a megfelelő pillanat. Maga a keretrendszer nem hajtja végre közvetlenül a feladatot — csupán értesíti az alkalmazást, hogy itt az ideje elindítani.
A regisztráció a feladat azonosítójának deklarálásával kezdődik a Info.plist-ben a BGTaskSchedulerPermittedIdentifiers tömbön keresztül. Ezután az alkalmazás kódjában meghívásra kerül a registerHandler(forTaskWithIdentifier:) metódus egy handler-closure-rel.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// kényszerített befejezéskor hívódik meg
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Regisztráció után az alkalmazásnak kifejezetten kérnie kell a feladat végrehajtását a submitTaskRequest segítségével. A kérés tartalmazza a feladat azonosítóját és a lehető legkorábbi indítás dátumát. A rendszer tárolja a kérést és feldolgozza, amikor a körülményeket megfelelőnek ítéli.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Ütemezési hiba: \(error)")
}
BGTaskScheduler két fő feladattípust kínál, amelyek mindegyike a saját használati forgatókönyvéhez készült. A megfelelő típus kiválasztása közvetlenül befolyásolja a feladat sikeres végrehajtásának valószínűségét a rendszer által.
BGAppRefreshTask rövid háttérbeli tartalomfrissítésekhez készült: új adatok betöltése, szinkronizálás a szerverrel, widgetek frissítése. A végrehajtási idő 30 másodpercre korlátozódik, amelynek letelte után a rendszer kényszerítve befejezi a feladatot. Ez a feladattípus gyakrabban kerül végrehajtásra, mint a BGProcessingTask, és magasabb prioritással rendelkezik.
BGProcessingTask hosszabb műveletekhez készült: médiafájlok feldolgozása, Core Data adatok indexelése, biztonsági mentések készítése. A feladat több percig is tarthat, de a rendszer ritkábban és csak kedvező körülmények között indítja el — tápfeszültségre csatlakoztatva, stabil Wi-Fi mellett és alacsony eszközterhelés esetén.
| Paraméter | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Időkorlát | 30 másodperc | több perc |
| Indítási gyakoriság | magas | alacsony |
| Feltételek | bármilyen | tápfeszültség + Wi-Fi |
| Tápfeszültséget igényel | nem | ajánlott |
| Példa | hírcsatorna frissítése | videó feldolgozása |
Helyes regisztráció a BGTaskScheduler működésének kötelező feltétele. Ha a feladat nincs regisztrálva az Info.plist-ben, a rendszer figyelmen kívül hagy minden végrehajtási kérelmet.
Az Info.plist fájlhoz hozzáadásra kerül egy BGTaskSchedulerPermittedIdentifiers tömb szöveges azonosítók listájával. Minden azonosítónak egyedinek kell lennie az alkalmazáson belül. Az Apple a fordított domain jelölés használatát ajánlja.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Az ütemezéshez a submitTaskRequest metódust használjuk. Ha a feladatra már nincs szükség, visszavonható a cancelTaskRequest vagy cancelAllTaskRequests segítségével. A rendszer automatikusan visszavonja a feladatokat az alkalmazás törlésekor vagy az adatok visszaállításakor.
A BGTaskScheduler lehetővé teszi az ütemezett feladatok állapotának nyomon követését a getPendingTaskRequests segítségével. Ez a metódus visszaadja az összes aktív kérés listáját a típusukról, azonosítójukról és earliestBeginDate-ről szóló információval. Minden kérés esetében ellenőrizhető, hogy már végrehajtották vagy visszavonták-e, és döntés hozható az újraütemezésről.
Fontos megjegyezni, hogy a rendszer nem nyújt közvetlen visszahívást a háttérfeladat sikeres végrehajtásáról — a handlernek magának kell jelentenie az eredményt a task tulajdonságokon keresztül. A setTaskCompleted lehetővé teszi a feladat sikeresen befejezettként való megjelölését, ezután a rendszer elindíthatja a következő ütemezett feladatot ebből a típusból. Ha a feladat nem hívja meg a setTaskCompleted-et, a rendszer befejezettnek tekinti az idő letelte után vagy kényszerített befejezéskor.
A problémák diagnosztizálásához ajánlott az OSLog használata a handlerben és a naplók megtekintése a Mac Console.app alkalmazásán keresztül. Az Apple a MetricKit eszközt is biztosítja a háttérfeladatok teljesítményének elemzéséhez — ez adatokat gyűjt a végrehajtási időről, energiafogyasztásról és indítási gyakoriságról, amelyek az optimalizáláshoz használhatók.
// Adott feladat visszavonása
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Minden feladat visszavonása
BGTaskScheduler.shared.cancelAllTaskRequests()
// Ütemezett feladatok ellenőrzése
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("\(requests.count) feladat ütemezve")
}
BGTaskScheduler szigorú korlátozásokat állít a háttérmunkára. A rendszer határozatlan ideig elhalaszthatja a feladatot, ha a körülmények kedvezőtlenek. A fejlesztőnek meg kell értenie, hogy a keretrendszer nem valós idejű feladatokra készült.
A legfontosabb korlátozások közé tartozik: a rendszer nem garantálja a feladat meghatározott időben történő végrehajtását, az egyidejű feladatok maximális száma korlátozott, és az energiafogyasztás szigorúan ellenőrzött. Több feladat egymás utáni indítása összeolvadáshoz vagy visszavonáshoz vezethet.
A végrehajtás valószínűségének növeléséhez ajánlott az earliestBeginDate beállítása legkorábban 1 órára a BGProcessingTask és 15 percre a BGAppRefreshTask esetében. Szintén fontos az expirationHandler kezelése — ha a feladat nem fér bele az időkorlátba, a rendszer meghívja ezt a handlert a megfelelő befejezés érdekében. Az újraütemezést a handleren belül kell végrehajtani a folyamatos háttérmunka ciklusának fenntartásához.
Egy másik fontos korlátozás a hálózati kérésekre vonatkozik. A BGTaskScheduler nem garantálja az aktív hálózati kapcsolatot a feladat végrehajtása során. Az alkalmazásnak magának kell ellenőriznie a hálózat elérhetőségét az NWPathMonitor segítségével és elhalasztania a feldolgozást, ha a kapcsolat nem él. Ez eltér az Android JobScheduler-től, amely csak egy adott típusú hálózathoz csatlakozva képes aktiválni a feladatot. A gyakorlatban a fejlesztők gyakran kombinálják a BGTaskScheduler-t az NSURLSession háttérbeli URL-munkameneteivel a megbízható adatbetöltés érdekében.
A macOS Catalina óta a BGTaskScheduler Mac-en is elérhető. Ez lehetővé teszi platformok közötti háttérfeladatok létrehozását az Apple Silicon-on futó UIKit-alkalmazásokhoz. A watchOS-en a keretrendszer korlátozottan működik — csak rövid BGAppRefreshTask áll rendelkezésre a komplikációk frissítéséhez és az iPhone-nal való adatszinkronizáláshoz. A fejlesztőknek figyelembe kell venniük a platformkülönbségeket a háttérarchitektúra tervezésekor.
A BGTaskScheduler hibakereséséhez az Apple több eszközt kínál. Az e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] parancs az lldb-ben kényszeríti a háttérfeladat indítását, figyelmen kívül hagyva a rendszerkorlátozásokat. Az Xcode-ban elérhető a Simulate Background Fetch jelző a Debug menüben, amely egy rövid háttérfrissítést szimulál. A teljesítményelemzéshez a MetricKit-et használjuk — ez információkat gyűjt az indítási gyakoriságról, a végrehajtás időtartamáról és az energiafogyasztásról minden feladat esetében. Ezek az adatok segítenek optimalizálni az ütemezési gyakoriságot és kiválasztani a megfelelő feladattípust.
A gyakorlatban a BGTaskScheduler jól alkalmas widget adatainak frissítésére, iCloud szinkronizálásra, push értesítések feldolgozására tartalommal és Spotlight keresés indexelésére. Nem alkalmas valós idejű analitika küldésére, chat alkalmazásokra vagy bármilyen azonnali végrehajtást igénylő feladatra.
A BGTaskScheduler mélyebb tanulmányozásához az Apple a hivatalos WWDC dokumentációt ajánlja: a „Advances in Background Tasks” (2020) munkamenet az elavult API-król való migrációt tárgyalja, a „Background Tasks in Practice” (2021) pedig valós használati eseteket tartalmaz. Szintén hasznos az Energy Efficiency Guide szakasz, amely leírja, hogyan illeszkedik a keretrendszer az Apple általános energiamegtakarítási stratégiájába. Kódpéldák az Apple Developer hivatalos GitHub tárhelyén érhetők el teljes iOS és macOS projektekkel.
Gyakran Ismételt Kérdések
Background Fetch egyetlen háttérfeladatra volt korlátozva alkalmazásonként, és nem rendelkezett prioritási mechanizmussal. A BGTaskScheduler több különböző típusú feladatot támogat, egységes API-t és automatikus energiafelügyeletet biztosít.
Az Apple nem állít explicit korlátozást a regisztrált azonosítók számára, de a gyakorlatban legfeljebb 5–10 feladat használata ajánlott. Nagyobb szám esetén csökken az egyes feladatok végrehajtásának valószínűsége a rendszererőforrásokért folytatott versengés miatt.
A hibakereséshez használja az e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] parancsot az lldb-ben. Ez kényszeríti a feladat indítását, megkerülve a rendszerkorlátozásokat. Szintén elérhető az Xcode Simulate Background Fetch jelző a Debug menüben.
Igen, a BGTaskScheduler elindíthatja a folyamatot akkor is, ha az alkalmazást a felhasználó kényszerítve bezárta. A rendszer azonban további késleltetést alkalmazhat, és nem minden feladattípus garantálja az indítást ebben a forgatókönyvben.
A rendszer meghívja az expirationHandler-t, jelezve a feladatnak a befejezés szükségességét. Ha az alkalmazás figyelmen kívül hagyja ezt a jelzést és folytatja a munkát, az iOS kényszerítve befejezi a folyamatot. Ezt követően a rendszer csökkentheti az alkalmazás összes háttérfeladatának prioritását.
Összefoglaló
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