Audio Session — mecanismul central iOS pentru gestionarea comportamentului audio al aplicației: interacțiunea cu sistemul, gestionarea întreruperilor și rutarea sunetului. Fiecare aplicație iOS primește o singură sesiune audio care determină cum se comportă sunetul la blocarea ecranului, în timpul apelurilor și la conectarea Bluetooth. Conform Apple Developer Documentation, 2026, Audio Session se configurează prin categorie și mod — fără o configurare corectă, aplicația poate să nu redea sunet în fundal.
Principalele puncte
Audio Session — este o singură instanță AVAudioSession creată de sistem la pornirea aplicației și care există pe tot parcursul ciclului său de viață. Acesta acționează ca un intermediar între aplicație și sistemul audio iOS: configurarea categoriei determină dacă aplicația poate reda sunet în fundal, dacă sunetul va fi redus în timpul unui apel și pe ce dispozitive să fie trimis sunetul.
Spre deosebire de Android Audio Focus, unde fiecare aplicație solicită și eliberează focalizarea independent, iOS Audio Session este gestionată centralizat printr-o singură sesiune per aplicație. La activarea sesiunii, sistemul dezactivează automat sesiunea aplicației anterioare, trimițându-i o notificare de întrerupere. Această diferență arhitecturală determină o abordare diferită a gestionării audio pe cele două platforme.
Conform WWDC 2024 Session 211, aproximativ 40% din problemele audio în aplicațiile iOS sunt cauzate de configurarea incorectă a Audio Session. Cea mai frecventă eroare — alegerea categoriei ambient în loc de playback, ceea ce face ca sunetul să dispară la blocarea ecranului.
La pornire, aplicația primește sharedInstance al sesiunii, setează categoria prin apelul setCategory(_:mode:options:) și activează sesiunea prin setActive(true). După activare, iOS ia în considerare politicile categoriei pentru rutare. Dacă o altă aplicație își activează sesiunea, cea curentă primește notificarea AudioSessionInterruptionType.began prin Notification.Name.AVAudioSessionInterruption.
Categoria — parametrul principal al Audio Session, care definește șase variante predefinite de comportament. Alegerea categoriei este prima și cea mai importantă decizie la configurarea audio în iOS.
| Categorie | Când să folosiți | Audio în fundal | Atenuare la mut |
|---|---|---|---|
| ambient | Jocuri, efecte de fundal | Nu | Da |
| playback | Muzică, podcasturi, cărți audio | Da | Nu |
| record | Reportofon, înregistrare audio | Nu | N/A |
| playAndRecord | VoIP, mesaje vocale | Da | Nu |
| multiRoute | Mixere DJ, karaoke | Da | Nu |
| soloAmbient | Implicit (iOS default) | Nu | Da |
Pentru playerele muzicale și video folosiți întotdeauna playback. Această categorie permite: redarea sunetului cu ecranul blocat, cu comutatorul mut dezactivat (butonul fizic de pe carcasa iPhone) și cu aplicația minimizată. Fără categoria playback, sesiunea se dezactivează la blocarea ecranului sau minimizarea aplicației.
Categoria ambient este potrivită pentru jocuri și aplicații cu sunete de fundal — permite altor aplicații să continue redarea. De exemplu, dacă utilizatorul ascultă muzică și deschide un joc cu sesiune ambient, muzica continuă să redea peste sunetele jocului. Aceasta este o diferență fundamentală față de Android, unde un astfel de scenariu necesită permisiunea explicită duck.
Configurarea Audio Session trebuie efectuată înainte de începerea oricărei redări. Se recomandă configurarea sesiunii în metoda application(_:didFinishLaunchingWithOptions:) sau în inițializatorul playerului. După configurarea categoriei, sesiunea trebuie activată.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Configurarea Audio Session a eșuat: \(error.localizedDescription)")
}
Parametrul options include allowBluetooth (ieșire pe casca Bluetooth) și defaultToSpeaker (redare prin difuzor, nu prin cel de convorbire). Opțiunea allowBluetooth este obligatorie pentru aplicațiile care suportă căști Bluetooth — fără ea, sunetul poate fi redat prin difuzorul încorporat chiar și cu casca conectată.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
Categoria playAndRecord cu modul voiceChat optimizează calea audio pentru comunicarea vocală: include suprimarea ecoului, reglarea automată a amplificării (AGC) și selectarea codecului optim. OverrideOutputAudioPort(.speaker) forțează ieșirea prin difuzor chiar și cu casca conectată — util pentru convorbiri în regim hands-free.
Apelul setActive(true) activează sesiunea și notifică sistemul că aplicația va folosi audio. La pauzarea redării, se recomandă dezactivarea sesiunii pentru ca alte aplicații să poată obține fluxul audio. Excepție — aplicațiile cu redare lungă în fundal (muzică, podcasturi), unde sesiunea rămâne activă pe tot parcursul melodiei.
Este important să gestionați erorile la setActive. Dacă o altă sesiune cu prioritate mare este activă (de exemplu, Telefon în timpul unui apel), setActive poate genera o eroare. În acest caz, trebuie să așteptați notificarea AudioSessionInterruptionType.ended și să reîncerce activarea.
Modul (mode) detaliază categoria și optimizează calea audio pentru un anumit tip de utilizare. Fiecare mod modifică comportamentul AGC, al suprimării ecoului și al codecurilor. Modurile nu înlocuiesc categoria, ci o completează — o categorie poate funcționa cu diferite moduri.
Opțiunile oferă reglarea fină a comportamentului sesiunii. Fiecare opțiune este un flag care se combină cu altele într-un tablou. De exemplu, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] permite ieșirea sunetului pe casca Bluetooth, utilizarea difuzorului implicit și mixarea cu cărțile audio.
În iOS 17+ a apărut opțiunea spatialAudio, care activează sunetul spațial personalizat pentru AirPods prin AVAudioSessionSpatialPreferences. Conform WWDC 2024, sunetul spațial crește implicarea utilizatorilor aplicațiilor muzicale cu 25% în testele Apple.
Întreruperile (interruptions) — diferența cheie dintre Audio Session și Android Audio Focus. În iOS, întreruperile sunt gestionate prin NotificationCenter prin abonarea la AVAudioSession.interruptionNotification. Notificarea conține un dicționar cu tipul întreruperii: began sau ended.
override func viewDidLoad() {
super.viewDidLoad()
let center = NotificationCenter.default
center.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
}
@objc func handleInterruption(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let type = userInfo[AVAudioSession.interruptionTypeKey]
as? AVAudioSessionInterruptionType
else { return }
switch type {
case began:
pausePlayback()
case ended:
guard let options = userInfo[AVAudioSession.interruptionOptionKey]
as? AVAudioSessionInterruptionOptions
else { return }
if options.contains(shouldResume) {
resumePlayback()
}
}
La primirea interruptionType.began, playerul trebuie să întrerupă redarea. La interruptionType.ended, proprietatea interruptionOptionKey indică dacă playerul poate relua automat (shouldResume). Dacă utilizatorul a terminat apelul, shouldResume = true. Dacă apelul s-a încheiat prin timeout — shouldResume = false, reluarea nu este permisă.
Când o altă aplicație își activează Audio Session cu categoria playback, sesiunea curentă primește o notificare de întrerupere. Dacă cealaltă aplicație folosește ambient, întreruperea nu are loc — sunetele sunt mixate. Acest comportament diferă radical de Android, unde orice activare a Audio Focus declanșează evenimentul LOSS.
Pentru aplicațiile care trebuie să continue redarea la activarea altor sesiuni (de exemplu, navigația în timpul redării muzicii), folosiți opțiunea .mixWithOthers. Această opțiune permite mixarea sunetului cu alte aplicații, iar întreruperile nu sunt trimise. MixWithOthers — echivalentul iOS al modului duck în Android.
Audio Session gestionează automat rutarea sunetului între difuzoarele încorporate, căști, căștile Bluetooth și dispozitivele AirPlay. Aplicația poate urmări ruta curentă prin proprietatea currentRoute și poate primi notificări de modificare prin AVAudioSession.routeChangeNotification.
La conectarea căștilor Bluetooth, iOS comută automat ieșirea audio pe acestea dacă sesiunea este configurată cu opțiunea allowBluetooth. Fără această opțiune, sunetul continuă să fie redat prin difuzorul încorporat. Începând cu iOS 16, la conectarea AirPods Pro, sistemul activează automat sincronizarea ProMotion pentru reducerea întârzierii.
Abonarea la routeChangeNotification permite reacționarea la conectarea și deconectarea căștilor. La deconectarea căștii Bluetooth, playerul trebuie să întrerupă redarea — utilizatorul s-ar putea să nu se aștepte ca sunetul să înceapă să se redea din difuzorul telefonului. Conform Apple HIG (2026), acesta este un comportament obligatoriu pentru aplicațiile muzicale.
Proprietățile availableInputs și availableOutputs returnează lista dispozitivelor audio disponibile cu tipurile lor (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Dezvoltatorul poate selecta programatic un anumit dispozitiv prin overrideOutputAudioPort pentru scenarii de rutare personalizate.
Întrebări frecvente
Diferența cheie — arhitectura. Audio Session este o sesiune centralizată per aplicație, configurată o singură dată. Audio Focus în Android necesită solicitarea manuală a focalizării de fiecare dată la redare. În plus, iOS suportă mixarea prin opțiunea mixWithOthers, iar în Android duck este singura alternativă la oprirea completă.
Cea mai frecventă cauză — categoria incorectă a Audio Session. Dacă a fost selectată ambient sau soloAmbient, sunetul se oprește la blocarea ecranului. Schimbați categoria la playback și asigurați-vă că în Info.plist a fost adăugat Background Modes — Audio, AirPlay, and Picture in Picture.
Adăugați opțiunea .mixWithOthers în setCategory. Aceasta va permite mixarea sunetului aplicației dvs. cu alte sesiuni active. Fără această opțiune, noua aplicație o întrerupe pe cea curentă. MixWithOthers — echivalentul modului duck în Android, dar cu păstrarea completă a volumului.
Folosiți overrideOutputAudioPort cu nil pentru selecția automată. Pentru ieșire forțată pe Bluetooth: obțineți AVAudioSessionRouteDescription din availableOutputs, selectați portul cu tipul .bluetoothA2DP și transmiteți-l la overrideOutputAudioPort. Asigurați-vă că sesiunea este configurată cu allowBluetooth.
Pentru majoritatea aplicațiilor — da. Dezactivarea sesiunii la pauză permite altor aplicații să obțină focalizarea audio. Excepție — playerele muzicale cu redare lungă în fundal. Dacă pauza este scurtă (mai puțin de 5 secunde), este mai bine să lăsați sesiunea activă pentru reluarea rapidă.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și