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, 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+ |
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("Грешка на аудио сесия: \(error)")
}
}
За интеграция с Control Center и Lock Screen трябва да конфигурирате MPRemoteCommandCenter. Той обработва командите Play, Pause, Next и Previous Track. Също така трябва да актуализирате MPNowPlayingInfoProperty за показване на метаданни: заглавие на песен, изпълнител, корица и напредък на възпроизвеждането.
От iOS 14 нататък, Background Mode аудио поддържа и 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 m и повече). Не изисква непрекъснато включване на 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. Достъпно до 10 минути.
За BGProcessingTask трябва да посочите requiresExternalPower и requiresNetworkConnectivity. Системата може да отложи изпълнението за неопределено време, ако условията не са изпълнени. За разлика от BGAppRefreshTask, който трябва да се изпълни поне веднъж дневно, Processing може да не се изпълни с седмици, ако устройството рядко се зарежда.
Apple стриктно проверява използването на Background Modes при ревю на приложения. Основно правило: всеки включен режим трябва да бъде обоснован от функционалността на приложението. Ако приложението декларира Location Mode, но не използва геолокация, то ще бъде отхвърлено с искане за премахване на capability.
Най-честите нарушения: Location Mode без явна необходимост (приложението иска достъп за показване на реклами), 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също