Background Modes — это набор декларируемых возможностей iOS, которые позволяют приложению продолжать выполнение кода после перехода в фоновый режим. Каждый режим соответствует определённому типу задач: аудио, геолокация, VoIP, Bluetooth, fetch и processing. По данным Apple, 2026, неправильное использование Background Modes является одной из частых причин отклонения приложений при ревью в App Store.
Главное
Background Modes — это capability проекта Xcode, которые декларируют намерение приложения выполнять определённые типы фоновых операций. В отличие от Android, где приложение может запустить любой Service в фоне, iOS требует явного указания режима в Info.plist. Каждый режим имеет строгие правила использования и проверяется Apple при ревью.
Когда приложение переходит в фон, iOS приостанавливает его через 3–5 секунд. Если приложение декларирует Background Mode и активно использует соответствующий API (например, AVAudioSession для аудио), система переводит его в специальный режим выполнения. Приложение остаётся в оперативной памяти и может выполнять код, ограниченный типом режима.
iOS поддерживает следующие Background Modes: Audio (аудио), Location (геолокация), 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 | Push-уведомления VoIP | 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+ |
Audio Background Mode — самый распространённый режим, используемый музыкальными плеерами, подкаст-приложениями и аудиосервисами. Приложение может продолжать воспроизведение звука, управляться через Control Center и отображаться на Lock Screen. Для активации достаточно настроить 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("Audio session error: \(error)")
}
}
Для интеграции с Control Center и Lock Screen нужно настроить MPRemoteCommandCenter. Он обрабатывает команды Play, Pause, Next и Previous Track. Также необходимо обновлять MPNowPlayingInfoProperty для отображения метаданных: название трека, исполнитель, обложка и прогресс воспроизведения.
Начиная с iOS 14, Background Mode audio также включает поддержку Picture in Picture для видео. Приложение может продолжать показывать видео в плавающем окне при сворачивании. Для активации используйте AVPictureInPictureController с AVPlayerLayer. Режим работает только если приложение воспроизводит аудиодорожку.
Location Background Mode позволяет приложению получать обновления геолокации в фоновом режиме. Используется в навигаторах, фитнес-трекерах, приложениях доставки и социальных сетях. Без этого режима приложение получает локацию только один раз при переходе в фон, после чего обновления прекращаются.
CLLocationManager поддерживает несколько стратегий отслеживания: значительные изменения (significant-change location), стандартное отслеживание (standard location) и отслеживание по регионам (region monitoring). Для фоновой работы с максимальной точностью используйте 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 работает без Location Background Mode — система пробуждает приложение только при значительном изменении координат (обычно 500 м и более). Не требует постоянного включения GPS, что экономит батарею. Подходит для приложений погоды, которые обновляют данные при перемещении пользователя.
Bluetooth LE Background Mode позволяет приложению взаимодействовать с BLE-устройствами в фоновом режиме. Используется фитнес-браслетами, медицинскими датчиками, Smart Home устройствами и Beacon-навигацией. Режим делится на два подтипа: 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 Background Mode предназначен для приложений голосовой связи (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, не в Low Power Mode. Доступно до 10 минут.
Для BGProcessingTask необходимо указать requiresExternalPower и requiresNetworkConnectivity. Система может отложить выполнение на неопределённый срок, если условия не соблюдены. В отличие от BGAppRefreshTask, который должен выполняться хотя бы раз за день, Processing может не выполняться неделями, если устройство редко на зарядке.
Apple строго проверяет использование Background Modes при ревью приложений. Основное правило: каждый включённый режим должен быть обоснован функциональностью приложения. Если приложение декларирует Location Mode, но не использует геолокацию, оно будет отклонено с требованием удалить capability.
Наиболее частые нарушения: Location Mode без явной необходимости (приложение запрашивает "Always" доступ для показа рекламы), Audio Mode без воспроизведения звука в фоне, VoIP без PushKit, BLE Mode без Bluetooth-устройств. Apple может отклонить приложение даже на этапе обновления, если режим больше не используется.
При отправке на ревью укажите в Notes конкретное обоснование каждого режима. Например, "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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также