Background Fetch: шта је то, принцип рада и подешавање ажурирања

Аутор: IT Sectr Објављено: 2026-03-27 Време читања: 8 мин

Background Fetch — механизам iOS-а који периодично буди апликацију у позадини за преузимање свежег садржаја. Систем анализира понашање корисника и бира оптималне прозоре за ажурирање. Према подацима Apple, 2026, апликација добија од 30 до 120 секунди за извршење операције, након чега систем суспендује или завршава процес.

Главне тачке

  • Background Fetch — iOS API за периодично ажурирање садржаја у позадини.
  • Систем управља учесталошћу буђења на основу анализе понашања корисника.
  • Минимални интервал се поставља преко UIApplication.minimumBackgroundFetchInterval.
  • Застарелост — од iOS 13+ механизам се сматра застарелим, препоручује се BGTaskScheduler.
  • Време извршења — до 30 секунди, након чега систем присилно завршава задатак.

Шта је Background Fetch у iOS?

Background Fetch — је iOS API који омогућава апликацији да периодично прима свеже податке у позадини. Први пут представљен у iOS 7 заједно са механизмом Background App Refresh. Главни циљ — да садржај буде актуелан у тренутку када корисник отвори апликацију, без потребе за чекањем учитавања.

Разлика од Push обавештења

Push обавештења покреће сервер — он шаље сигнал на уређај, а систем одлучује да ли да пробуди апликацију или не. Background Fetch покреће сам iOS на основу образаца коришћења уређаја. Push је бољи за хитне поруке, Fetch — за планирано ажурирање садржаја (вести, феид друштвене мреже).

Место у екосистему позадинских задатака

Background Fetch — један од неколико механизама позадинског извршења у iOS. BGAppRefreshTask (iOS 13+) обавља исти задатак, али са флексибилнијим планирањем. Background Modes (аудио, локација) — за непрекидне операције. Silent Push — ажурирање покренуто од стране сервера. Fetch остаје актуелан за пројекте који подржавају iOS 12 и старије верзије.

  • Background Fetch — периодично, покреће систем, iOS 7+.
  • BGAppRefreshTask — периодично, покреће систем, iOS 13+.
  • BGProcessingTask — дуготрајни задаци, iOS 13+.
  • Silent Push — покреће сервер, iOS 7+.

Како ради Background Fetch: архитектура и животни циклус

iOS користи алгоритам машинског учења за одређивање оптималног времена буђења апликације. Систем анализира када корисник обично отвара апликацију, колико дуго је користи и колико често се враћа. На основу ових података, iOS израчунава прозоре за Background Fetch.

Процес извршења задатка

Када систем одлучи да пробуди апликацију, позива метод application(_:performFetchWithCompletionHandler:) у AppDelegate. Апликација треба да преузме минималну количину нових података и позове completion handler са једним од три статуса: .newData (подаци преузети), .noData (нема нових података) или .failed (грешка). Статус утиче на учесталост будућих буђења.

Утицај completion handler-а на учесталост позива

Статус .newData обавештава систем да је ажурирање било корисно — iOS може повећати учесталост буђења. .noData говори да података нема — учесталост остаје иста или се смањује. .failed сигнализира проблем — систем смањује учесталост да не би трошио батерију. Нагласак треба да буде на искреном статусу, а не на присилном .newData.

СтатусЗначењеУтицај
.newDataПодаци успешно преузетиУчесталост може порасти
.noDataПровера није дала нове податкеУчесталост остаје иста
.failedГрешка мреже или сервераУчесталост се смањује

Подешавање Background Fetch у Xcode пројекту

Да бисте укључили Background Fetch потребно је извршити два корака: активирати capability у Xcode и поставити минимални интервал у коду. Capability се налази у Target — Signing & Capabilities — Background Modes — означити поље Background Fetch. Без овог корака систем неће будити апликацију.

Постављање минималног интервала

Метод UIApplication.shared.setMinimumBackgroundFetchInterval поставља минимално време у секундама између позива Fetch-а. Вредност UIApplication.backgroundFetchIntervalMinimum (отприлике 15 минута) указује систему да буди апликацију онолико често колико је енергетски ефикасно. Постављање интервала у application(_:didFinishLaunchingWithOptions:) је стандардна пракса.

swift
func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
    UIApplication.shared.setMinimumBackgroundFetchInterval(
        UIApplication.backgroundFetchIntervalMinimum
    )
    return true
}

Info.plist и capability

При укључивању Background Fetch-а у Xcode аутоматски ажурира Info.plist — додаје кључ UIBackgroundModes са вредношћу fetch. Ово је обавезан корак: без њега апликација неће примити позив performFetchWithCompletionHandler. Присуство можете проверити преко P list Source или Build Settings.

Примери кода Background Fetch у Swift

Размотримо потпуну имплементацију Background Fetch-а за апликацију вести. Имплементација укључује преузимање података, кеширање и позивање completion handler-а. Код се извршава у AppDelegate — једином месту где систем позива fetch.

swift
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 са позадинским контекстом за безбедно писање у нитима. Након чувања, ажурирајте интерфејс у главној нити.

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

Тестирање Background Fetch-а

За тестирање користите 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-а, али напредак неће бити праћен до следећег буђења.

Миграција са Background Fetch на BGTaskScheduler

Почев од iOS 13, Apple препоручује BGTaskScheduler као замену за Background Fetch. BGTaskScheduler пружа флексибилније планирање, два типа задатака (refresh и processing) и регистрацију задатака са идентификаторима. Миграција укључује неколико корака и препоручује се за све нове пројекте.

Корачна миграција

Први корак — одредити идентификаторе задатака у Info.plist преко кључа BGTaskSchedulerPermittedIdentifiers. Други — регистровати задатке у AppDelegate преко BGTaskScheduler.shared.register. Трећи — заменити позив performFetchWithCompletionHandler handler-ом прослеђеним у register. Четврти — позвати submit за планирање задатка.

swift
// Раније (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-а

BGTaskScheduler даје више контроле: BGProcessingTask за дуготрајне операције (до 10 минута), услове извршења преко requiresNetworkConnectivity и requiresExternalPower, expiration handler за безболно завршавање. Систем такође анализира коришћење апликације, али програмер може поставити прецизније захтеве.

Када задржати Background Fetch

Ако апликација подржава iOS 12 и старије верзије, Background Fetch остаје једина опција за периодично ажурирање. BGTaskScheduler је доступан само од iOS 13+. У овом случају користите омот: проверавајте доступност BGTaskScheduler-а преко if #available(iOS 13, *) и позивајте одговарајући API.

Често постављана питања

Колико често iOS позива Background Fetch?

Тачна учесталост није документована и зависи од понашања корисника. Систем анализира колико често корисник отвара апликацију и прилагођава учесталост у складу с тим. У просеку, при активном коришћењу fetch се може позивати 1–3 пута на сат. При ретком коришћењу — 1–2 пута дневно.

Зашто мој Background Fetch није позван?

Проверите три услова: Background Fetch capability је укључена у Xcode, постављен је minimumBackgroundFetchInterval и корисник није искључио Background App Refresh за апликацију у подешавањима. Такође проверите да уређај није у Low Power Mode и да је ниво батерије изнад 20%.

Која је разлика између Background Fetch и BGAppRefreshTask?

Background Fetch — стари API (iOS 7), BGAppRefreshTask — нови API (iOS 13+). BGAppRefreshTask пружа више контроле: expiration handler, могућност препланирања и проверу статуса. Background Fetch је једноставнији за имплементацију, али мање флексибилан. Apple препоручује коришћење BGAppRefreshTask за нове пројекте.

Могу ли се преузимати велике датотеке путем Background Fetch-а?

Не препоручује се. Background Fetch је временски ограничен (до 30 секунди). За велика преузимања користите URLSession са background configuration — систем ће наставити преузимање чак и након завршетка fetch-а. Алтернатива — BGProcessingTask (iOS 13+), где је доступно до 10 минута са условима пуњења.

Да ли Background Fetch троши батерију?

Да, свако буђење троши енергију на укључивање процесора, иницијализацију мрежног стека и преузимање података. iOS оптимизује учесталост како би минимизирао утицај. Уз правилну имплементацију — преузимање само нових података, брзо позивање completion handler-а — утицај на батерију је минималан.

Резиме

  • Background Fetch — iOS API за периодично преузимање података у позадини, доступан од iOS 7 и препоручен за замену са BGTaskScheduler.
  • Систем управља учесталошћу позива анализирајући понашање корисника — програмер не може гарантовати време буђења.
  • Три статуса completion handler-а — .newData, .noData, .failed — утичу на учесталост будућих буђења апликације.
  • Ограничење од 30 секунди — не извршавајте дуготрајне операције или више узастопних мрежних захтева.
  • Capability је обавезна — Background Fetch у Xcode + постављање minimumBackgroundFetchInterval у коду.
  • BGTaskScheduler — модерна замена од iOS 13+, која пружа више контроле и два типа задатака.
  • За пројекте који подржавају iOS 12 старије, користите Background Fetch са провером доступности BGTaskScheduler преко if #available.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође