Background Fetch — iOS mexanizmi, dövri olaraq tətbiqi fonda oyadaraq təzə məzmun yükləmək üçün. Sistem istifadəçinin davranışını təhlil edir və yeniləmə üçün optimal pəncərələri seçir. Apple, 2026 məlumatlarına görə, tətbiq əməliyyatı yerinə yetirmək üçün 30-dan 120 saniyəyə qədər vaxt alır, bundan sonra sistem prosesi dayandırır və ya başa çatdırır.
Əsas məqamlar
Background Fetch — bu, tətbiqə fonda dövri olaraq təzə məlumat almağa imkan verən iOS API-dir. İlk dəfə iOS 7-də Background App Refresh mexanizmi ilə birlikdə təqdim edilmişdir. Əsas məqsəd — məzmunun istifadəçi tətbiqi açdığı anda aktual olması, yükləməni gözləməyə ehtiyac olmamasıdır.
Push bildirişləri server tərəfindən başladılır — o, cihaza siqnal göndərir və sistem tətbiqi oyatmaq və ya yox qərarı verir. Background Fetch iOS-un özü tərəfindən cihazın istifadə nümunələri əsasında başladılır. Push təcili mesajlar üçün daha uyğundur, Fetch — planlı məzmun yeniləməsi üçün (xəbərlər, sosial şəbəkə lentləri).
Background Fetch — iOS-da fon icrası mexanizmlərindən biridir. BGAppRefreshTask (iOS 13+) eyni tapşırığı yerinə yetirir, lakin daha çevik planlama ilə. Background Modes (audio, lokasiya) — davamlı əməliyyatlar üçün. Silent Push — server tərəfindən başladılan yeniləmə. Fetch iOS 12 və aşağısını dəstəkləyən layihələr üçün aktual olaraq qalır.
iOS tətbiqin oyanması üçün optimal vaxtı müəyyən etmək məqsədilə maşın öyrənmə alqoritmindən istifadə edir. Sistem istifadəçinin adətən tətbiqi nə vaxt açdığını, nə qədər istifadə etdiyini və nə qədər tez-tez qayıtdığını təhlil edir. Bu məlumatlar əsasında iOS Background Fetch üçün pəncərələri hesablayır.
Sistem tətbiqi oyatmaq qərarına gəldikdə, AppDelegate-də application(_:performFetchWithCompletionHandler:) metodunu çağırır. Tətbiq minimum miqdarda yeni məlumat yükləməli və üç statusdan biri ilə completion handler çağırmalıdır: .newData (məlumat yükləndi), .noData (yeni məlumat yoxdur) və ya .failed (xəta). Status gələcək oyanmaların tezliyinə təsir edir.
.newData statusu sistemə yeniləmənin faydalı olduğunu bildirir — iOS oyanma tezliyini artıra bilər. .noData məlumat olmadığını deyir — tezlik eyni qalır və ya azalır. .failed problem olduğunu göstərir — sistem batareyanı boşaltmamaq üçün tezliyi azaldır. Vurğu dürüst statusda olmalıdır, məcburi .newData-da deyil.
| Status | Məna | Təsir |
|---|---|---|
| .newData | Məlumat uğurla yükləndi | Tezlik arta bilər |
| .noData | Yoxlama yeni məlumat vermədi | Tezlik eyni qalır |
| .failed | Şəbəkə və ya server xətası | Tezlik azalır |
Background Fetch-i aktivləşdirmək üçün iki addım yerinə yetirmək lazımdır: Xcode-da capability-ni aktivləşdirmək və kodda minimum interval təyin etmək. Capability Target — Signing & Capabilities — Background Modes — Background Fetch checkbox-ını qeyd etməklə tapılır. Bu addım olmadan sistem tətbiqi oyatmayacaq.
UIApplication.shared.setMinimumBackgroundFetchInterval metodu Fetch çağırışları arasında minimum vaxtı saniyələrlə təyin edir. UIApplication.backgroundFetchIntervalMinimum dəyəri (təxminən 15 dəqiqə) sistemə tətbiqi enerji səmərəli olduğu qədər tez-tez oyatmağı bildirir. application(_:didFinishLaunchingWithOptions:) daxilində intervalın təyini standart təcrübədir.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
Background Fetch Xcode-da aktivləşdirildikdə avtomatik olaraq Info.plist-i yeniləyir — UIBackgroundModes açarını fetch dəyəri ilə əlavə edir. Bu məcburi addımdır: onsuz tətbiq performFetchWithCompletionHandler çağırışını almayacaq. Mövcudluğu P list Source və ya Build Settings vasitəsilə yoxlamaq olar.
Xəbər tətbiqi üçün Background Fetch-in tam tətbiqini nəzərdən keçirək. Tətbiq məlumat yükləmə, keşləmə və completion handler çağırışını əhatə edir. Kod AppDelegate-də icra olunur — sistemin fetch çağırdığı yeganə yer.
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()
}
Background Fetch vasitəsilə məlumat yükləndikdən sonra onları yerli yaddaşa — CoreData, UserDefaults və ya File Manager-ə saxlamaq lazımdır. Tətbiq açıldıqda məlumat artıq əlçatan olmalıdır. Təhlükəsiz yazma üçün fon konteksti ilə CoreData istifadə edin. Saxlamadan sonra UI-ni əsas iplikdə yeniləyin.
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()
}
}
Test üçün Simulator istifadə edin — Xcode-da Debug — Simulate Background Fetch seçin. Fiziki cihazda sistemin fetch etmək qərarına gələnə qədər gözləmək lazımdır. Sürətləndirmək üçün minimum intervalı 1 dəqiqəyə təyin etmək olar, lakin sistem batareya az olduqda yenə də onu görməzliyə vura bilər.
Background Fetch-in bir sıra məhdudiyyətləri var ki, tətbiq arxitekturasını layihələndirərkən nəzərə almaq vacibdir. Əsas odur ki, sistem çağırışların tezliyini tamamilə idarə edir və tərtibatçı onu zəmanət altına ala bilməz. Hətta minimum interval təyin edildikdə belə, sistem fetch-i saatlarla çağırmaya bilər.
Sistem tətbiqə tapşırığı yerinə yetirmək üçün məhdud vaxt ayırır — adətən 30 saniyəyə qədər. Tətbiq bu müddət ərzində completion handler çağırmazsa, sistem prosesi məcburi başa çatdırır və gələcək oyanmaların tezliyini azaldır. Bütün şəbəkə sorğuları kompakt olmalıdır — çağırış başına 1–2-dən çox olmamalıdır.
iOS Background Fetch-in planlanması zamanı batareyanın doldurulma səviyyəsini nəzərə alır. Səviyyə 20%-dən aşağı olduqda oyanma tezliyi azalır. Low Power Mode rejimi aktiv olduqda sistem bütün tətbiqlər üçün fon yeniləmələrini tamamilə söndürə bilər. İstifadəçi həmçinin parametrlərdə müəyyən bir tətbiq üçün Background App Refresh-i söndürə bilər.
Background Fetch-dən işə salınan URLSession standart rejimdə işləyir — fon sessiyalarını dəstəkləmir. Böyük yükləmələr üçün URLSession background configuration istifadə edin. Sistem fetch bitdikdən sonra da yükləməni davam etdirəcək, lakin növbəti oyanmaya qədər irəliləyiş izlənməyəcək.
iOS 13-dən başlayaraq, Apple Background Fetch-in əvəzi olaraq BGTaskScheduler-ı tövsiyə edir. BGTaskScheduler daha çevik planlama, iki növ tapşırıq (refresh və processing) və identifikatorlarla tapşırıqların qeydiyyatını təmin edir. Miqrasiya bir neçə addımı əhatə edir və bütün yeni layihələr üçün tövsiyə olunur.
Birinci addım — Info.plist-də BGTaskSchedulerPermittedIdentifiers açarı vasitəsilə tapşırıq identifikatorlarını təyin etmək. İkinci — BGTaskScheduler.shared.register vasitəsilə AppDelegate-də tapşırıqları qeydiyyatdan keçirmək. Üçüncü — performFetchWithCompletionHandler çağırışını register-ə ötürülən handler ilə əvəz etmək. Dördüncü — tapşırığı planlaşdırmaq üçün submit çağırmaq.
// Əvvəllər (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// Miqrasiyadan sonra (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 daha çox nəzarət verir: BGProcessingTask uzunmüddətli əməliyyatlar üçün (10 dəqiqəyə qədər), requiresNetworkConnectivity və requiresExternalPower vasitəsilə icra şərtləri, hamar başa çatdırma üçün expiration handler. Sistem də tətbiqin istifadəsini təhlil edir, lakin tərtibatçı daha dəqiq tələblər təyin edə bilər.
Tətbiq iOS 12 və aşağısını dəstəkləyirsə, Background Fetch dövri yeniləmə üçün yeganə seçim olaraq qalır. BGTaskScheduler yalnız iOS 13+-də mövcuddur. Bu halda sarğıcıdan istifadə edin: BGTaskScheduler mövcudluğunu if #available(iOS 13, *) vasitəsilə yoxlayın və müvafiq API çağırın.
Tez-tez verilən suallar
Dəqiq tezlik sənədləşdirilməyib və istifadəçinin davranışından asılıdır. Sistem təhlil edir, istifadəçinin tətbiqi nə qədər tez-tez açdığını və tezliyi müvafiq olaraq uyğunlaşdırır. Orta hesabla aktiv istifadə zamanı fetch saatda 1–3 dəfə çağırıla bilər. Nadir istifadə zamanı — gündə 1–2 dəfə.
Üç şərti yoxlayın: Background Fetch capability Xcode-da aktivdir, minimumBackgroundFetchInterval təyin edilib və istifadəçi parametrlərdə tətbiq üçün Background App Refresh-i söndürməyib. Həmçinin cihazın Low Power Mode-da olmadığını və batareya səviyyəsinin 20%-dən yuxarı olduğunu yoxlayın.
Background Fetch — köhnə API (iOS 7), BGAppRefreshTask — yeni API (iOS 13+). BGAppRefreshTask daha çox nəzarət təmin edir: expiration handler, yenidən planlaşdırma imkanı və status yoxlaması. Background Fetch tətbiqdə daha sadədir, lakin daha az çevikdir. Apple yeni layihələr üçün BGAppRefreshTask istifadəsini tövsiyə edir.
Tövsiyə edilmir. Background Fetch vaxt baxımından məhduddur (30 saniyəyə qədər). Böyük yükləmələr üçün background configuration ilə URLSession istifadə edin — sistem fetch bitdikdən sonra da yükləməni davam etdirəcək. Alternativ — BGProcessingTask (iOS 13+), burada 10 dəqiqəyə qədər vaxt və şarj şərtləri mövcuddur.
Bəli, hər oyanma prosessoru işə salmaq, şəbəkə yığınını işə salmaq və məlumat yükləmək üçün enerji sərf edir. iOS optimallaşdırır tezliyi, təsiri minimuma endirmək üçün. Düzgün tətbiqdə — yalnız yeni məlumatların yüklənməsi, completion handler-in sürətli çağırışı — batareyaya təsir minimaldır.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun