Background Fetch: какво е, принцип на работа и конфигурация на актуализациите

Автор: IT Sectr Публикувано: 2026-03-27 Време за четене: 8 мин

Background Fetch — механизъм на iOS, който периодично събужда приложението на заден фон за зареждане на свежо съдържание. Системата анализира поведението на потребителя и избира оптимални прозорци за актуализация. Според данни на Apple, 2026, приложението получава от 30 до 120 секунди за изпълнение на операцията, след което системата спира или прекратява процеса.

Основни точки

  • Background Fetch — iOS API за периодично актуализиране на съдържание на заден фон.
  • Системата управлява честотата на събужданията на база анализ на поведението на потребителя.
  • Минимален интервал се задава чрез UIApplication.minimumBackgroundFetchInterval.
  • Остаряване — от iOS 13+ механизмът се счита за legacy, препоръчва се 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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също