Background Fetch — механизам iOS-а који периодично буди апликацију у позадини за преузимање свежег садржаја. Систем анализира понашање корисника и бира оптималне прозоре за ажурирање. Према подацима Apple, 2026, апликација добија од 30 до 120 секунди за извршење операције, након чега систем суспендује или завршава процес.
Главне тачке
Background Fetch — је iOS API који омогућава апликацији да периодично прима свеже податке у позадини. Први пут представљен у iOS 7 заједно са механизмом Background App Refresh. Главни циљ — да садржај буде актуелан у тренутку када корисник отвори апликацију, без потребе за чекањем учитавања.
Push обавештења покреће сервер — он шаље сигнал на уређај, а систем одлучује да ли да пробуди апликацију или не. Background Fetch покреће сам iOS на основу образаца коришћења уређаја. Push је бољи за хитне поруке, Fetch — за планирано ажурирање садржаја (вести, феид друштвене мреже).
Background Fetch — један од неколико механизама позадинског извршења у iOS. BGAppRefreshTask (iOS 13+) обавља исти задатак, али са флексибилнијим планирањем. Background Modes (аудио, локација) — за непрекидне операције. Silent Push — ажурирање покренуто од стране сервера. Fetch остаје актуелан за пројекте који подржавају iOS 12 и старије верзије.
iOS користи алгоритам машинског учења за одређивање оптималног времена буђења апликације. Систем анализира када корисник обично отвара апликацију, колико дуго је користи и колико често се враћа. На основу ових података, iOS израчунава прозоре за Background Fetch.
Када систем одлучи да пробуди апликацију, позива метод application(_:performFetchWithCompletionHandler:) у AppDelegate. Апликација треба да преузме минималну количину нових података и позове completion handler са једним од три статуса: .newData (подаци преузети), .noData (нема нових података) или .failed (грешка). Статус утиче на учесталост будућих буђења.
Статус .newData обавештава систем да је ажурирање било корисно — iOS може повећати учесталост буђења. .noData говори да података нема — учесталост остаје иста или се смањује. .failed сигнализира проблем — систем смањује учесталост да не би трошио батерију. Нагласак треба да буде на искреном статусу, а не на присилном .newData.
| Статус | Значење | Утицај |
|---|---|---|
| .newData | Подаци успешно преузети | Учесталост може порасти |
| .noData | Провера није дала нове податке | Учесталост остаје иста |
| .failed | Грешка мреже или сервера | Учесталост се смањује |
Да бисте укључили Background Fetch потребно је извршити два корака: активирати capability у Xcode и поставити минимални интервал у коду. Capability се налази у Target — Signing & Capabilities — Background Modes — означити поље Background Fetch. Без овог корака систем неће будити апликацију.
Метод UIApplication.shared.setMinimumBackgroundFetchInterval поставља минимално време у секундама између позива Fetch-а. Вредност UIApplication.backgroundFetchIntervalMinimum (отприлике 15 минута) указује систему да буди апликацију онолико често колико је енергетски ефикасно. Постављање интервала у application(_:didFinishLaunchingWithOptions:) је стандардна пракса.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
При укључивању Background Fetch-а у Xcode аутоматски ажурира Info.plist — додаје кључ UIBackgroundModes са вредношћу fetch. Ово је обавезан корак: без њега апликација неће примити позив performFetchWithCompletionHandler. Присуство можете проверити преко P list Source или Build Settings.
Размотримо потпуну имплементацију Background Fetch-а за апликацију вести. Имплементација укључује преузимање података, кеширање и позивање completion handler-а. Код се извршава у AppDelegate — једином месту где систем позива fetch.
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-а потребно их је сачувати у локалном складишту — CoreData, UserDefaults или File Manager. При отварању апликације подаци би већ требало да буду доступни. Користите CoreData са позадинским контекстом за безбедно писање у нитима. Након чувања, ажурирајте интерфејс у главној нити.
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()
}
}
За тестирање користите Simulator — изаберите Debug — Simulate Background Fetch у Xcode. На физичком уређају потребно је сачекати док систем одлучи да изврши fetch. За убрзавање можете поставити минимални интервал на 1 минут, али систем га и даље може игнорисати при ниском нивоу батерије.
Background Fetch има низ ограничења која је важно узети у обзир при пројектовању архитектуре апликације. Главно — система потпуно контролише учесталост позива и програмер је не може гарантовати. Чак и са постављеним минималним интервалом, систем може не позивати fetch сатима.
Систем додељује апликацији ограничено време за извршење задатка — обично до 30 секунди. Ако апликација не позове completion handler у овом времену, систем присилно завршава процес и смањује учесталост будућих буђења. Сви мрежни захтеви треба да буду компактни — не више од 1–2 по позиву.
iOS узима у обзир ниво напуњености батерије при планирању Background Fetch-а. Када је ниво испод 20%, учесталост буђења се смањује. Када је укључен режим Low Power Mode, систем може потпуно да искључи позадинска ажурирања за све апликације. Корисник такође може да искључи Background App Refresh за одређену апликацију у подешавањима.
URLSession покренут из Background Fetch-а ради у стандардном режиму — без подршке за позадинске сесије. За велика преузимања користите URLSession са background configuration. Систем ће наставити преузимање чак и након завршетка fetch-а, али напредак неће бити праћен до следећег буђења.
Почев од iOS 13, Apple препоручује BGTaskScheduler као замену за Background Fetch. BGTaskScheduler пружа флексибилније планирање, два типа задатака (refresh и processing) и регистрацију задатака са идентификаторима. Миграција укључује неколико корака и препоручује се за све нове пројекте.
Први корак — одредити идентификаторе задатака у Info.plist преко кључа BGTaskSchedulerPermittedIdentifiers. Други — регистровати задатке у AppDelegate преко BGTaskScheduler.shared.register. Трећи — заменити позив performFetchWithCompletionHandler handler-ом прослеђеним у register. Четврти — позвати submit за планирање задатка.
// Раније (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// Након миграције (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 даје више контроле: BGProcessingTask за дуготрајне операције (до 10 минута), услове извршења преко requiresNetworkConnectivity и requiresExternalPower, expiration handler за безболно завршавање. Систем такође анализира коришћење апликације, али програмер може поставити прецизније захтеве.
Ако апликација подржава iOS 12 и старије верзије, Background Fetch остаје једина опција за периодично ажурирање. BGTaskScheduler је доступан само од iOS 13+. У овом случају користите омот: проверавајте доступност BGTaskScheduler-а преко if #available(iOS 13, *) и позивајте одговарајући API.
Често постављана питања
Тачна учесталост није документована и зависи од понашања корисника. Систем анализира колико често корисник отвара апликацију и прилагођава учесталост у складу с тим. У просеку, при активном коришћењу fetch се може позивати 1–3 пута на сат. При ретком коришћењу — 1–2 пута дневно.
Проверите три услова: Background Fetch capability је укључена у Xcode, постављен је minimumBackgroundFetchInterval и корисник није искључио Background App Refresh за апликацију у подешавањима. Такође проверите да уређај није у Low Power Mode и да је ниво батерије изнад 20%.
Background Fetch — стари API (iOS 7), BGAppRefreshTask — нови API (iOS 13+). BGAppRefreshTask пружа више контроле: expiration handler, могућност препланирања и проверу статуса. Background Fetch је једноставнији за имплементацију, али мање флексибилан. Apple препоручује коришћење BGAppRefreshTask за нове пројекте.
Не препоручује се. Background Fetch је временски ограничен (до 30 секунди). За велика преузимања користите URLSession са background configuration — систем ће наставити преузимање чак и након завршетка fetch-а. Алтернатива — BGProcessingTask (iOS 13+), где је доступно до 10 минута са условима пуњења.
Да, свако буђење троши енергију на укључивање процесора, иницијализацију мрежног стека и преузимање података. iOS оптимизује учесталост како би минимизирао утицај. Уз правилну имплементацију — преузимање само нових података, брзо позивање completion handler-а — утицај на батерију је минималан.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође