Background Modes — це набір оголошуваних можливостей iOS, які дозволяють додатку продовжувати виконання коду після переходу в фоновий режим. Кожен режим відповідає певному типу завдань: аудіо, геолокація, VoIP, Bluetooth, fetch та processing. За даними Apple, 2026, неправильне використання Background Modes є однією з частих причин відхилення додатків під час ревю в App Store.
Головне
Background Modes — це можливості проекту Xcode, які оголошують намір додатку виконувати певні типи операцій у фоновому режимі. На відміну від Android, де додаток може запустити будь-який Service у фоні, iOS вимагає явного зазначення режиму в Info.plist. Кожен режим має суворі правила використання та перевіряється Apple під час ревю.
Коли додаток переходить у фон, iOS припиняє його через 3–5 секунд. Якщо додаток оголошує Background Mode та активно використовує відповідний API (наприклад, AVAudioSession для аудіо), система переводить його в спеціальний режим виконання. Додаток залишається в оперативній пам’яті та може виконувати код, обмежений типом режиму.
iOS підтримує такі Background Modes: Аудіо, Локація, VoIP, Bluetooth LE (BLE-аксесуари), Background Fetch (періодичні оновлення), Background Processing (тривалі завдання), External Accessory Communication, Push to Talk (PTT) та HealthKit. Кожен режим вимагає обґрунтування в описі додатка.
| Режим | Ключ Info.plist | Призначення | Версія iOS |
|---|---|---|---|
| Audio | audio | Фонове аудіо, AirPlay | 4.0+ |
| Location | location | Відстеження місцезнаходження | 4.0+ |
| VoIP | voip | VoIP push-сповіщення | 4.0+ |
| BLE | bluetooth-central | Робота з BLE-пристроями | 7.0+ |
| Fetch | fetch | Періодичне завантаження даних | 7.0+ |
| Processing | processing | Тривалі фонові завдання | 13.0+ |
| Push to Talk | push-to-talk | Голосове push-to-talk | 16.0+ |
Аудіо фоновий режим — найпоширеніший режим, що використовується музичними плеєрами, подкаст-додатками та аудіослужбами. Додаток може продовжувати відтворення аудіо, керуватися через Центр керування та відображатися на екрані блокування. Для активації достатьо налаштувати AVAudioSession з категорією .playback.
Для роботи аудіо у фоні необхідно налаштувати AVAudioSession та активувати її. Категорія .playback повідомляє системі, що додаток відтворює аудіо і повинен залишатися активним у фоні. Без цього налаштування звук зупиниться через 5–10 секунд після згортання додатка.
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playback,
mode: .default,
options: []
)
try session.setActive(true)
} catch {
print("Помилка аудіосесії: \(error)")
}
}
Для інтеграції з Центром керування та екраном блокування потрібно налаштувати MPRemoteCommandCenter. Він обробляє команди Відтворення, Пауза, Наступний та Попередній трек. Також необхідно оновлювати MPNowPlayingInfoProperty для відображення метаданих: назва треку, виконавець, обкладинка та прогрес відтворення.
Починаючи з iOS 14, аудіо фоновий режим також підтримує Picture in Picture для відео. Додаток може продовжувати показ відео у плаваючому вікні при згортанні. Для активації використовуйте AVPictureInPictureController з AVPlayerLayer. Цей режим працює лише якщо додаток відтворює аудіодоріжку.
Фоновий режим локації дозволяє додатку отримувати оновлення місцезнаходження у фоні. Він використовується в навігаторах, фітнес-трекерах, додатках доставки та соціальних мережах. Без цього режиму додаток отримує локацію лише один раз при переході в фон, після чого оновлення припиняються.
CLLocationManager підтримує кілька стратегій відстеження: значні зміни локації, стандартне відстеження та моніторинг регіонів. Для фонової роботи з максимальною точністю використовуйте allowsBackgroundLocationUpdates = true та pausesLocationUpdatesAutomatically = false.
Постійне відстеження локації у фоні — один з найбільш енергоємних сценаріїв. iOS автоматично адаптує частоту оновлень залежно від швидкості руху: при ходьбі оновлення кожні 10–30 секунд, при їзді на автомобілі — кожні 1–5 секунд. Для навігації використовуйте desiredAccuracy = kCLLocationAccuracyBestForNavigation.
let locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.activityType = .fitness
locationManager.startUpdatingLocation()
Режим significant-change location працює без фонового режиму локації — система пробуджує додаток лише при значній зміні координат (звичайно 500 м або більше). Не потребує постійного GPS, що економить батарею. Підходить для додатків погоди, які оновлюють дані при переміщенні користувача.
Bluetooth LE фоновий режим дозволяє додатку взаємодіяти з BLE-пристроями у фоні. Він використовується фітнес-браслетами, медичними датчиками, пристроями Smart Home та навігацією за біконами. Режим поділяється на два підтипи: bluetooth-central (додаток під’єднується до пристроїв) та bluetooth-peripheral (додаток виступає як пристрій).
Додаток, що виступає як Central, може сканувати та під’єднуватися до BLE-пристроїв у фоні. Для цього вкажіть bluetooth-central в Background Modes та викличіть CBCentralManager.scanForPeripherals з опцією CBCentralManagerScanOptionAllowDuplicatesKey. У фоні сканування працює з низькою частотою — система може затримувати виявлення для економії енергії.
Додаток, що виступає як Peripheral, може анонсувати послуги та відповідати на запити інших пристроїв. Режим bluetooth-peripheral дозволяє додатку залишатися видимим для інших BLE-пристроїв навіть у фоні. Він використовується в додатках HealthKit та IoT-рішеннях.
Моніторинг iBeacon працює у фоні без додаткових дозволів — система сама відстежує вхід та вихід з регіонів Beacon. Але для сканування вмісту Beacon (proximity UUID, major, minor) потрібний дозвіл Bluetooth та bluetooth-central Background Mode. Для моніторингу використовуйте CLLocationManager з CLBeaconRegion.
VoIP фоновий режим призначений для додатків голосового зв’язку (Skype, Zoom, WhatsApp). Цей режим дозволяє додатку залишатися підключеним до сервера для прийому вхідних викликів. Починаючи з iOS 8, для VoIP використовується PushKit — фреймворк, який обробляє push-сповіщення від VoIP-сервера без участі APNs.
PushKit — єдиний механізм, що гарантує доставку VoIP-сповіщень на пристрій. При отриманні PushKit-сповіщення система пробуджує додаток, навіть якщо він був завершений. Додаток повинен протягом 30 секунд встановити з’єднання з сервером та відобразити локальне сповіщення про вхідний виклик.
import PushKit
class VoIPHandler: NSObject, PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping () -> Void
) {
let caller = payload.dictionaryPayload["caller"] as! String
reportIncomingCall(from: caller)
completion()
}
}
PushKit не можна використовувати для звичайних сповіщень — лише для VoIP, watchOS-комунікацій та постачальників файлів. Apple перевіряє це під час ревю. Неправомірне використання призводить до відхилення додатка. Починаючи з iOS 13, PushKit лише доставляє сповіщення — виклик CXProvider (CallKit) для відображення екрану виклику є обов’язковим.
Background Fetch та Background Processing — це режими для фонового оновлення контенту та виконання тривалих завдань. Fetch — короткі періодичні оновлення (до 30 с), Processing — тривалі завдання (до 10 хв) з умовами (Wi-Fi, зарядка). Processing доступний лише з iOS 13+.
Режим Fetch дозволяє системі періодично пробуджувати додаток для завантаження нового контенту. Система аналізує поведінку користувача та обирає оптимальний час. Додаток повинен викликати completion handler протягом 30 секунд. Fetch підходить для новинних додатків, стрічок соціальних мереж та погоди.
BGProcessingTask призначена для завдань, які можуть виконуватися без участі користувача: очищення кешу, синхронізація великої бази даних, обробка медіафайлів. Система запускає завдання лише за сприятливих умов — пристрій на зарядці, підключено до Wi-Fi, не в режимі низького енергоспоживання. Доступно до 10 хвилин.
Для BGProcessingTask необхідно вказати requiresExternalPower та requiresNetworkConnectivity. Система може відкласти виконання на невизначений термін, якщо умови не виконані. На відміну від BGAppRefreshTask, який повинен виконуватися хоча б один раз на день, Processing може не виконуватися тижнями, якщо пристрій рідко заряджається.
Apple суворо перевіряє використання Background Modes під час ревю додатків. Основне правило: кожен увімкнений режим повинен бути обґрунтований функціоналом додатка. Якщо додаток оголошує Location Mode, але не використовує геолокацію, його буде відхилено з вимогою видалити можливість.
Найпоширеніші порушення: Location Mode без явної необхідності (додаток запитує доступ завжди для показу реклами), Audio Mode без відтворення звуку в фоні, VoIP без PushKit, BLE Mode без Bluetooth-пристроїв. Apple може відхилити додаток навіть на етапі оновлення, якщо режим більше не використовується.
При надсиланні на ревю зазначте в Нотатках конкретне обґрунтування кожного режиму. Наприклад, «Location Background Mode використовується для відстеження маршруту користувача у фітнес-функції». Без пояснення ревюер може відхилити додаток. Для конфіденційних функцій (VoIP) Apple може запитати тестовий акаунт.
Використовуйте мінімально необхідний набір режимів. Якщо вашому додатку потрібне фонове завантаження даних раз на годину — не вмикайте Location Mode, використовуйте Fetch або BGAppRefreshTask. Зайві режими не тільки призводять до відхилення, але й створюють негативне враження: користувач бачить у налаштуваннях, що додаток використовує геолокацію у фоні.
Часто задавані питання
Обмежень на кількість немає, але кожен режим повинен бути обґрунтований функціоналом додатка. Увімкнення всіх режимів без необхідності — гарантована причина відхилення під час ревю. Практичне обмеження — 2–3 режими на додаток, інакше користувач побачить багато запитів на дозволи.
Використовуйте UIApplication.shared.applicationState — додаток може перевіряти, чи знаходиться він у фоні (state == .background). Також можна відстежувати сповіщення UIApplication.didEnterBackgroundNotification та willEnterForegroundNotification для перемикання поведінки.
Audio — відтворення звуку через динамік або навушники. AirPlay — передача аудіо та відео на Apple TV та інші AirPlay-пристрої. На практиці Audio Mode охоплює обидва сценарії, оскільки AirPlay використовує аудіосесію. Окремий режим AirPlay не потрібний з iOS 7+.
Так, для цього використовуйте requestWhenInUseAuthorization() замість requestAlwaysAuthorization(). Додаток отримуватиме локацію лише на передньому плані. Якщо потрібне короткочасове відстеження у фоні — викличіть startUpdatingLocation() та зупиніть у willResignActive.
Кожен режим збільшує енергоспоживання. Location Mode — найбільш енергоємний, може скоротити час роботи батареї на 30–50% при неперервному відстеженні. Audio Mode — помірний (15–20%). Fetch та Processing — мінімальний (2–5%). BLE Mode — низький (5–10%) завдяки енергоефективності Bluetooth LE.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також