BGTaskScheduler — iOS 13 va undan yangi versiyalardagi ilovalarda fon vazifalarini rejalashtirish va bajarish uchun Apple freymvorki. U eskirgan Background Fetch va performFetch oʻrnini egallab, fon operatsiyalari bilan ishlash uchun yagona API taqdim etadi. Apple Developer Documentation, 2026 maʼlumotlariga koʻra, freymvork ikki turdagi vazifalarni oʻz ichiga oladi: uzoq muddatli operatsiyalar uchun BGProcessingTask va qisqa kontent yangilanishlari uchun BGAppRefreshTask.
Asosiy maʼlumotlar
BGTaskScheduler — iOS 13 da taqdim etilgan, fon vazifalarining bajarilishini markazlashtirilgan holda boshqaradigan tizim Apple freymvorki. U paydo boʻlishidan oldin, dasturchilar UIApplication backgroundTasks, performFetch va appDelegate da hodisalarni qayta ishlashdan foydalanar edilar, bu esa kodning tarqoqligi va oldindan aytib boʻlmaydigan xatti-harakatlarga olib kelardi.
Freymvork kechiktirilgan rejalashtirish printsipi bilan ishlaydi: ilova noyob identifikatorlar bilan vazifalarni roʻyxatdan oʼtkazadi, iOS esa ularni bajarish uchun optimal momentni oʻzi belgilaydi. Tizim batareya zaryadi darajasini, foydalanuvchi faolligini, tarmoq holatini va boshqa omillarni hisobga oladi.
Asosiy imkoniyatlar ham qisqa, ham uzoq muddatli fon operatsiyalari bilan ishlashni oʻz ichiga oladi. Android-dagi AlarmManager dan farqli oʻlaroq, BGTaskScheduler aniq bajarish vaqtini kafolatlamaydi — tizim shartlar noqulay boʻlganda vazifani kechiktirish huquqini oʻzida saqlaydi.
BGTaskScheduler handler-larga asoslangan arxitekturadan foydalanadi. Ilova har bir vazifa turi uchun handler roʻyxatdan oʼtkazadi va tizim tegishli moment kelganda uni chaqiradi. Freymvork vazifani toʻgʻridan-toʻgʻri bajarmaydi — u faqat ilovaga vazifani ishga tushirish vaqti kelganligi haqida xabar beradi.
Roʻyxatdan oʼtish Info.plist da BGTaskSchedulerPermittedIdentifiers massivi orqali vazifa identifikatorini eʼlon qilish bilan boshlanadi. Soʻngra ilova kodida registerHandler(forTaskWithIdentifier:) metodi handler-closure bilan chaqiriladi.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// majburiy tugatishda chaqiriladi
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Roʻyxatdan oʼtgandan soʻng, ilova submitTaskRequest orqali vazifaning bajarilishini aniq talab qilishi kerak. Soʻrov vazifa identifikatori va mumkin boʻlgan eng erta boshlanish sanasini oʻz ichiga oladi. Tizim soʻrovni saqlaydi va shartlarni mos deb hisoblaganda qayta ishlaydi.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Rejalashtirish xatosi: \(error)")
}
BGTaskScheduler har biri oʻzining foydalanish stsenariysi uchun moʼljallangan ikkita asosiy vazifa turini taqdim etadi. Toʻgʻri turni tanlash toʻgʻridan-toʻgʻri vazifaning tizim tomonidan muvaffaqiyatli bajarilish ehtimoliga taʼsir qiladi.
BGAppRefreshTask fon kontentini qisqa yangilash uchun moʼljallangan: yangi maʼlumotlarni yuklash, server bilan sinxronlash, vidjetlarni yangilash. Bajarish vaqti 30 soniya bilan cheklangan, bu muddat tugagandan soʻng tizim vazifani majburiy tugatadi. Bu turdagi vazifalar BGProcessingTask ga qaraganda tez-tez bajariladi va yuqori ustuvorlikka ega.
BGProcessingTask uzoqroq operatsiyalar uchun moʼljallangan: media fayllarni qayta ishlash, Core Data maʼlumotlarini indekslash, zaxira nusxalarni yaratish. Vazifa bir necha daqiqagacha davom etishi mumkin, ammo tizim uni kamroq va faqat qulay sharoitlarda — quvvat manbaiga ulanganda, barqaror Wi-Fi va qurilma yuki past boʼlganda ishga tushiradi.
| Parametr | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Vaqt cheklovi | 30 soniya | bir necha daqiqa |
| Ishga tushirish chastotasi | yuqori | past |
| Shartlar | istalgan | quvvat + Wi-Fi |
| Quvvat talab qiladi | yoʻq | tavsiya etiladi |
| Misol | lentani yangilash | videoni qayta ishlash |
Toʻgʻri roʻyxatdan oʼtkazish BGTaskScheduler ishlashi uchun majburiy shartdir. Agar vazifa Info.plist da roʻyxatdan oʼtkazilmagan boʻlsa, tizim uning bajarilishi haqidagi har qanday soʻrovni eʼtiborsiz qoldiradi.
Info.plist fayliga matn identifikatorlari roʻyxati bilan BGTaskSchedulerPermittedIdentifiers massivi qoʻshiladi. Har bir identifikator ilova doirasida noyob boʻlishi kerak. Apple teskari domen notasidan foydalanishni tavsiya qiladi.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Rejalashtirish uchun submitTaskRequest metodidan foydalaniladi. Agar vazifa endi kerak boʻlmasa, uni cancelTaskRequest yoki cancelAllTaskRequests orqali bekor qilish mumkin. Tizim ilova oʻchirilganda yoki maʼlumotlar tiklanganda vazifalarni avtomatik bekor qiladi.
BGTaskScheduler getPendingTaskRequests orqali rejalashtirilgan vazifalarning holatini kuzatish imkoniyatini beradi. Bu metod barcha faol soʻrovlar roʻyxatini ularning turi, identifikatori va earliestBeginDate haqidagi maʼlumot bilan qaytaradi. Har bir soʻrov uchun uning allaqachon bajarilgan yoki bekor qilinganligini tekshirish va qayta rejalashtirish toʻgʻrisida qaror qabul qilish mumkin.
Shuni taʼkidlash kerakki, tizim fon vazifasining muvaffaqiyatli bajarilishi haqida toʻgʻridan-toʻgʻri Callback taqdim etmaydi — handler oʻzi natijani task xususiyatlari orqali xabar qilishi kerak. setTaskCompleted vazifani muvaffaqiyatli yakunlangan deb belgilashga imkon beradi, shundan soʻng tizim ushbu turdagi keyingi rejalashtirilgan vazifani ishga tushirishi mumkin. Agar vazifa setTaskCompleted ni chaqirmasa, tizim uni vaqt tugaganda yoki majburiy tugatishda yakunlangan deb hisoblaydi.
Muammolarni diagnostika qilish uchun handlerda OSLog dan foydalanish va Mac da Console.app orqali jurnallarni koʻrish tavsiya etiladi. Apple shuningdek, fon vazifalari samaradorligini tahlil qilish uchun MetricKit vositasini taqdim etadi — u optimallashtirish uchun ishlatilishi mumkin boʻlgan bajarish vaqti, energiya sarfi va ishga tushirish chastotasi haqidagi maʼlumotlarni toʻplaydi.
// Muayyan vazifani bekor qilish
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Barcha vazifalarni bekor qilish
BGTaskScheduler.shared.cancelAllTaskRequests()
// Rejalashtirilgan vazifalarni tekshirish
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("\(requests.count) vazifa rejalashtirildi")
}
BGTaskScheduler fon ishiga qattiq cheklovlar qoʻyadi. Tizim shartlar noqulay boʻlganda vazifani nomaʼlum muddatga kechiktirishi mumkin. Dasturchi freymvork real vaqt vazifalari uchun moʼljallanmaganligini tushunishi kerak.
Asosiy cheklovlar qatoriga: tizim vazifaning belgilangan vaqtda bajarilishini kafolatlamaydi, bir vaqtda bajariladigan vazifalarning maksimal soni cheklangan va energiya sarfi qattiq nazorat qilinadi. Bir nechta vazifani ketma-ket ishga tushirish ularning birlashishiga yoki bekor qilinishiga olib kelishi mumkin.
Bajarish ehtimolini oshirish uchun earliestBeginDate ni BGProcessingTask uchun 1 soatdan, BGAppRefreshTask uchun esa 15 daqiqadan kechiktirmasdan belgilash tavsiya etiladi. Shuningdek, expirationHandler ni qayta ishlash muhim — agar vazifa limitga sigʻmasa, tizim toʻgʻri yakunlash uchun ushbu handler ni chaqiradi. Qayta rejalashtirish uzluksiz fon ish siklini saqlab qolish uchun handler ning ichida amalga oshirilishi kerak.
Yana bir muhim cheklov tarmoq soʻrovlariga tegishli. BGTaskScheduler vazifani bajarish vaqtida faol tarmoq ulanishining mavjudligini kafolatlamaydi. Ilova NWPathMonitor orqali tarmoq mavjudligini oʻzi tekshirishi va ulanish boʻlmasa ishlov berishni kechiktirishi kerak. Bu maʼlum turdagi tarmoqqa ulangandagina vazifani faollashtira oladigan Android JobScheduler dan farq qiladi. Amalda, dasturchilar ishonchli maʼlumot yuklash uchun BGTaskScheduler ni tez-tez NSURLSession fon URL sessiyalari bilan birlashtiradilar.
macOS Catalina dan boshlab BGTaskScheduler Mac da ham mavjud. Bu Apple Silicon da ishlaydigan UIKit ilovalari uchun platformalararo fon vazifalarini yaratishga imkon beradi. watchOS da freymvork cheklangan holda ishlaydi — faqat komplikatsiyalarni yangilash va iPhone bilan maʼlumot sinxronlash uchun qisqa BGAppRefreshTask mavjud. Dasturchilar fon arxitekturasini rejalashtirishda platforma farqlarini hisobga olishlari kerak.
BGTaskScheduler ni disk raskadrovka qilish uchun Apple bir nechta vositalarni taqdim etadi. e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] buyrugʻi lldb da tizim cheklovlarini eʼtiborga olmagan holda fon vazifasini majburiy ishga tushiradi. Xcode da Debug menyusida Simulate Background Fetch bayrogʻi mavjud boʻlib, u qisqa fon yangilanishini emulyatsiya qiladi. Samaradorlik tahlili uchun MetricKit ishlatiladi — u har bir vazifaning ishga tushirish chastotasi, bajarish davomiyligi va energiya sarfi haqida maʼlumot toʻplaydi. Bu maʼlumotlar rejalashtirish chastotasini optimallashtirish va toʻgʻri vazifa turini tanlashga yordam beradi.
Amalda BGTaskScheduler vidjet maʼlumotlarini yangilash, iCloud sinxronlash, kontentli push bildirishnomalarini qayta ishlash va Spotlight qidiruv indeksatsiyasi uchun yaxshi mos keladi. Real vaqt analitikasini yuborish, chat ilovalari yoki darhol bajarishni talab qiladigan har qanday vazifalar uchun mos emas.
BGTaskScheduler ni chuqur oʼrganish uchun Apple rasmiy WWDC hujjatlarini tavsiya qiladi: “Advances in Background Tasks” (2020) sessiyasi eskirgan API lardan migratsiyani, “Background Tasks in Practice” (2021) esa real foydalanish holatlarini oʻz ichiga oladi. Shuningdek, freymvorkning Apple ning umumiy energiya tejash strategiyasiga qanday moslashishini tavsiflovchi Energy Efficiency Guide boʻlimi foydalidir. Kod namunalari GitHub da Apple Developer rasmiy reposida iOS va macOS uchun toʻliq loyihalar bilan mavjud.
Tez-tez beriladigan savollar
Background Fetch ilova uchun bitta fon vazifasi bilan cheklangan edi va ustuvorlik mexanizmiga ega emas edi. BGTaskScheduler turli xil vazifalarni qoʻlab-quvvatlaydi, yagona API va avtomatik energiya boshqaruvini taqdim etadi.
Apple roʻyxatdan oʼtkazilgan identifikatorlar soniga aniq cheklov qoʻymaydi, ammo amalda 5–10 tadan koʻp boʻlmagan vazifadan foydalanish tavsiya etiladi. Koʻproq son tizim resurslari uchun raqobat tufayli har bir aniq vazifaning bajarilish ehtimolini kamaytiradi.
Disk raskadrovka uchun lldb da e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] buyrugʻidan foydalaning. U tizim cheklovlarini chetlab oʻtib, vazifani majburiy ishga tushiradi. Shuningdek, Xcode Debug menyusida Simulate Background Fetch bayrogʻi mavjud.
Ha, BGTaskScheduler ilova foydalanuvchi tomonidan majburiy yopilgan boʼlsa ham jarayonni ishga tushirishi mumkin. Biroq, tizim qoʻshimcha kechikishlarni qoʻllashi mumkin va barcha vazifa turlari ushbu stsenariyda ishga tushishni kafolatlamaydi.
Tizim expirationHandler ni chaqiradi va vazifaga tugatish zarurligi haqida signal yuboradi. Agar ilova bu signalni eʼtiborsiz qoldirib, ishni davom ettirsa, iOS jarayonni majburiy tugatadi. Shundan soʻng tizim ilovaning barcha fon vazifalarining ustuvorligini pasaytirishi mumkin.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.