Audio Session es el mecanismo central de iOS para gestionar el comportamiento de audio de una aplicación: interacción con el sistema, manejo de interrupciones y enrutamiento de audio. Cada aplicación de iOS recibe una única sesión de audio que determina cómo se comporta el sonido cuando la pantalla está bloqueada, durante llamadas y al conectar Bluetooth. Según la Documentación para Desarrolladores de Apple, 2026, Audio Session se configura mediante una categoría y un modo — sin una configuración adecuada, la aplicación puede no reproducir sonido en segundo plano.
Puntos Clave
Audio Session es una única instancia de AVAudioSession creada por el sistema cuando se inicia una aplicación y existe durante todo su ciclo de vida. Actúa como intermediario entre la aplicación y el sistema de audio de iOS: la configuración de la categoría determina si la aplicación puede reproducir sonido en segundo plano, si el sonido se silenciará durante una llamada y a qué dispositivos enviar el audio.
A diferencia de Android Audio Focus, donde cada aplicación solicita y libera el foco de forma independiente, Audio Session de iOS se gestiona de forma centralizada a través de una sesión por aplicación. Cuando se activa una sesión, el sistema desactiva automáticamente la sesión de la aplicación anterior, enviándole una notificación de interrupción. Esta diferencia arquitectónica define los distintos enfoques para el manejo de audio en las dos plataformas.
Según la sesión 211 de WWDC 2024, aproximadamente el 40% de los problemas de audio en aplicaciones iOS se deben a una configuración incorrecta de Audio Session. El error más común es elegir la categoría ambient en lugar de playback, lo que provoca que el sonido desaparezca al bloquear la pantalla.
Al iniciarse, la aplicación obtiene la sharedInstance de la sesión, establece la categoría mediante la llamada setCategory(_:mode:options:) y activa la sesión a través de setActive(true). Después de la activación, iOS considera las políticas de categoría para el enrutamiento. Si otra aplicación activa su sesión, la actual recibe una notificación AudioSessionInterruptionType.began a través de Notification.Name.AVAudioSessionInterruption.
La categoría es el parámetro principal de Audio Session, que define seis opciones predefinidas de comportamiento. Elegir una categoría es la primera y más importante decisión al configurar el audio en iOS.
| Categoría | Cuándo Usar | Audio en Segundo Plano | Silencio Afecta |
|---|---|---|---|
| ambient | Juegos, efectos de fondo | No | Sí |
| playback | Música, podcasts, audiolibros | Sí | No |
| record | Grabadora de voz, grabación de audio | No | N/D |
| playAndRecord | VoIP, mensajes de voz | Sí | No |
| multiRoute | Mezcladores DJ, karaoke | Sí | No |
| soloAmbient | Predeterminado (iOS default) | No | Sí |
Para reproductores de música y video, use siempre playback. Esta categoría permite: reproducir sonido con la pantalla bloqueada, con el interruptor de silencio apagado (botón físico en el iPhone) y con la aplicación en segundo plano. Sin la categoría playback, la sesión se desactiva al bloquear la pantalla o minimizar la aplicación.
La categoría ambient es adecuada para juegos y aplicaciones con sonidos de fondo — permite que otras aplicaciones continúen reproduciendo. Por ejemplo, si un usuario está escuchando música y abre un juego con una sesión ambient, la música continúa sonando sobre los sonidos del juego. Esta es una diferencia fundamental con Android, donde tal escenario requiere un permiso explícito de duck.
La configuración de Audio Session debe realizarse antes de comenzar cualquier reproducción. Se recomienda configurar la sesión en el método application(_:didFinishLaunchingWithOptions:) o en el inicializador del reproductor. Después de establecer la categoría, la sesión debe activarse.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Error al configurar Audio Session: \(error.localizedDescription)")
}
El parámetro options incluye allowBluetooth (salida a auriculares Bluetooth) y defaultToSpeaker (reproducción a través del altavoz en lugar del auricular). La opción allowBluetooth es obligatoria para aplicaciones que admiten auriculares Bluetooth — sin ella, el sonido puede dirigirse al altavoz incorporado incluso cuando hay un auricular conectado.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
La categoría playAndRecord con el modo voiceChat optimiza la ruta de audio para la comunicación por voz: activa la cancelación de eco, el control automático de ganancia (AGC) y selecciona el códec óptimo. OverrideOutputAudioPort(.speaker) fuerza la salida a través del altavoz incluso cuando hay un auricular conectado — útil para el manos libres.
Llamar a setActive(true) activa la sesión y notifica al sistema que la aplicación usará audio. Cuando se pausa la reproducción, se recomienda desactivar la sesión para que otras aplicaciones puedan obtener el flujo de audio. La excepción son las aplicaciones con reproducción prolongada en segundo plano (música, podcasts), donde la sesión permanece activa durante toda la pista.
Es importante manejar los errores al llamar a setActive. Si otra sesión con alta prioridad está activa (por ejemplo, Teléfono durante una llamada), setActive puede lanzar un error. En este caso, debe esperar la notificación AudioSessionInterruptionType.ended y reintentar la activación.
El modo refina la categoría y optimiza la ruta de audio para un caso de uso específico. Cada modo cambia el comportamiento del AGC, la cancelación de eco y los códecs. Los modos no reemplazan la categoría sino que la complementan — una categoría puede funcionar con diferentes modos.
Las opciones proporcionan un ajuste fino del comportamiento de la sesión. Cada opción es una bandera que se puede combinar con otras en un array. Por ejemplo, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] permite la salida de sonido a un auricular Bluetooth, usa el altavoz por defecto y se mezcla con audiolibros.
En iOS 17+ apareció la opción spatialAudio, que activa el audio espacial personalizado para AirPods a través de AVAudioSessionSpatialPreferences. Según WWDC 2024, el audio espacial aumenta la participación de los usuarios en aplicaciones de música en un 25% en las pruebas de Apple.
Las interrupciones son una diferencia clave entre Audio Session y Android Audio Focus. En iOS, las interrupciones se manejan a través de NotificationCenter suscribiéndose a AVAudioSession.interruptionNotification. La notificación contiene un diccionario con el tipo de interrupción: began o 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()
}
}
Al recibir interruptionType.began, el reproductor debe pausar la reproducción. Al recibir interruptionType.ended, la propiedad interruptionOptionKey indica si el reproductor puede reanudarse automáticamente (shouldResume). Si el usuario rechazó la llamada, shouldResume = true. Si la llamada terminó por tiempo de espera — shouldResume = false, no se permite la reanudación.
Cuando otra aplicación activa su Audio Session con la categoría playback, la sesión actual recibe una notificación de interrupción. Si otra aplicación usa ambient, no ocurre ninguna interrupción — los sonidos se mezclan. Este comportamiento es drásticamente diferente de Android, donde cualquier activación de Audio Focus desencadena un evento LOSS.
Para las aplicaciones que necesitan continuar reproduciendo cuando se activan otras sesiones (por ejemplo, navegación mientras se reproduce música), use la opción .mixWithOthers. Esta opción permite la mezcla de sonido con otras aplicaciones y no se envían interrupciones. MixWithOthers es el equivalente iOS del modo duck en Android.
Audio Session gestiona automáticamente el enrutamiento de audio entre altavoces integrados, auriculares, dispositivos Bluetooth y dispositivos AirPlay. La aplicación puede monitorear la ruta actual a través de la propiedad currentRoute y recibir notificaciones sobre cambios mediante AVAudioSession.routeChangeNotification.
Cuando se conectan auriculares Bluetooth, iOS cambia automáticamente la salida de audio a ellos si la sesión está configurada con la opción allowBluetooth. Sin esta opción, el sonido continúa a través del altavoz integrado. A partir de iOS 16, al conectar AirPods Pro, el sistema activa automáticamente la sincronización ProMotion para reducir la latencia.
Suscribirse a routeChangeNotification permite reaccionar a la conexión y desconexión de auriculares. Cuando se desconecta un auricular Bluetooth, el reproductor debe pausar la reproducción — el usuario podría no esperar que el sonido comience a salir del altavoz del teléfono. Según Apple HIG (2026), este es un comportamiento obligatorio para aplicaciones de música.
Las propiedades availableInputs y availableOutputs devuelven una lista de dispositivos de audio disponibles con sus tipos (builtInSpeaker, headphones, bluetoothA2DP, hdmi). El desarrollador puede seleccionar programáticamente un dispositivo específico a través de overrideOutputAudioPort para escenarios de enrutamiento personalizados.
Preguntas Frecuentes
La diferencia clave es la arquitectura. Audio Session es una única sesión centralizada por aplicación que se configura una vez. Audio Focus en Android requiere solicitar el foco manualmente cada vez que se reproduce. Además, iOS admite la mezcla a través de la opción mixWithOthers, mientras que en Android duck es la única alternativa a la detención completa.
La causa más común es una categoría incorrecta de Audio Session. Si se selecciona ambient o soloAmbient, el sonido se detiene al bloquear la pantalla. Cambie la categoría a playback y asegúrese de que Background Modes — Audio, AirPlay, and Picture in Picture esté agregado en Info.plist.
Agregue la opción .mixWithOthers a setCategory. Esto permitirá mezclar el sonido de su aplicación con otras sesiones activas. Sin esta opción, una nueva aplicación interrumpe la actual. MixWithOthers es el análogo del modo duck en Android, pero con preservación completa del volumen.
Use overrideOutputAudioPort con nil para selección automática. Para salida forzada a Bluetooth: obtenga AVAudioSessionRouteDescription de availableOutputs, seleccione un puerto con el tipo .bluetoothA2DP y páselo a overrideOutputAudioPort. Asegúrese de que la sesión esté configurada con allowBluetooth.
Para la mayoría de las aplicaciones — sí. Desactivar la sesión al pausar permite que otras aplicaciones obtengan el foco de audio. La excepción son los reproductores de música con reproducción prolongada en segundo plano. Si la pausa es corta (menos de 5 segundos), es mejor mantener la sesión activa para una reanudación rápida.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también