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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също