Audio Session é o mecanismo central do iOS para gerenciar o comportamento de áudio de um aplicativo: interação com o sistema, tratamento de interrupções e roteamento de áudio. Cada aplicativo iOS recebe uma única sessão de áudio que determina como o som se comporta quando a tela está bloqueada, durante chamadas e ao conectar Bluetooth. De acordo com a Documentação do Desenvolvedor Apple, 2026, o Audio Session é configurado através de uma categoria e modo — sem a configuração correta, o aplicativo pode não reproduzir som em segundo plano.
Principais Pontos
Audio Session é uma única instância do AVAudioSession criada pelo sistema quando um aplicativo é iniciado e existe durante todo o seu ciclo de vida. Atua como intermediário entre o aplicativo e o sistema de áudio do iOS: a configuração da categoria determina se o aplicativo pode reproduzir som em segundo plano, se o som será silenciado durante uma chamada e para quais dispositivos enviar o áudio.
Ao contrário do Android Audio Focus, onde cada aplicativo solicita e libera o foco de forma independente, o Audio Session do iOS é gerenciado centralmente através de uma sessão por aplicativo. Quando uma sessão é ativada, o sistema desativa automaticamente a sessão do aplicativo anterior, enviando-lhe uma notificação de interrupção. Essa diferença arquitetural define as diferentes abordagens para o tratamento de áudio nas duas plataformas.
De acordo com a Sessão 211 da WWDC 2024, cerca de 40% dos problemas de áudio em aplicativos iOS são causados por configuração incorreta do Audio Session. O erro mais comum é escolher a categoria ambient em vez de playback, o que faz o som desaparecer quando a tela é bloqueada.
Ao iniciar, o aplicativo obtém o sharedInstance da sessão, define a categoria através da chamada setCategory(_:mode:options:) e ativa a sessão através de setActive(true). Após a ativação, o iOS considera as políticas de categoria para o roteamento. Se outro aplicativo ativar sua sessão, o atual recebe uma notificação AudioSessionInterruptionType.began através do Notification.Name.AVAudioSessionInterruption.
A categoria é o parâmetro principal do Audio Session, definindo seis opções predefinidas de comportamento. Escolher uma categoria é a primeira e mais importante decisão ao configurar áudio no iOS.
| Categoria | Quando Usar | Áudio em Segundo Plano | Silêncio Afeta |
|---|---|---|---|
| ambient | Jogos, efeitos de fundo | Não | Sim |
| playback | Música, podcasts, audiolivros | Sim | Não |
| record | Gravador de voz, gravação de áudio | Não | N/D |
| playAndRecord | VoIP, mensagens de voz | Sim | Não |
| multiRoute | Mixers DJ, karaokê | Sim | Não |
| soloAmbient | Padrão (iOS default) | Não | Sim |
Para players de música e vídeo, use sempre playback. Esta categoria permite: reproduzir som com a tela bloqueada, com o interruptor de silêncio desligado (botão físico no iPhone) e com o aplicativo em segundo plano. Sem a categoria playback, a sessão é desativada ao bloquear a tela ou minimizar o aplicativo.
A categoria ambient é adequada para jogos e aplicativos com sons de fundo — permite que outros aplicativos continuem reproduzindo. Por exemplo, se um usuário está ouvindo música e abre um jogo com uma sessão ambient, a música continua tocando sobre os sons do jogo. Esta é uma diferença fundamental do Android, onde tal cenário requer permissão explícita de duck.
A configuração do Audio Session deve ser feita antes de iniciar qualquer reprodução. Recomenda-se configurar a sessão no método application(_:didFinishLaunchingWithOptions:) ou no inicializador do player. Após definir a categoria, a sessão deve ser ativada.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Falha na configuração do Audio Session: \(error.localizedDescription)")
}
O parâmetro options inclui allowBluetooth (saída para fone Bluetooth) e defaultToSpeaker (reprodução através do alto-falante em vez do auricular). A opção allowBluetooth é obrigatória para aplicativos que suportam fones Bluetooth — sem ela, o som pode ser direcionado ao alto-falante integrado mesmo com um fone conectado.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
A categoria playAndRecord com o modo voiceChat otimiza o caminho de áudio para comunicação por voz: ativa o cancelamento de eco, controle automático de ganho (AGC) e seleciona o codec ideal. OverrideOutputAudioPort(.speaker) força a saída pelo alto-falante mesmo com um fone conectado — útil para viva-voz.
Chamar setActive(true) ativa a sessão e notifica o sistema que o aplicativo usará áudio. Quando a reprodução é pausada, recomenda-se desativar a sessão para que outros aplicativos possam obter o fluxo de áudio. A exceção são aplicativos com reprodução prolongada em segundo plano (música, podcasts), onde a sessão permanece ativa durante toda a faixa.
É importante tratar erros ao chamar setActive. Se outra sessão com alta prioridade estiver ativa (por exemplo, Telefone durante uma chamada), setActive pode lançar um erro. Neste caso, aguarde a notificação AudioSessionInterruptionType.ended e tente a ativação novamente.
O modo refina a categoria e otimiza o caminho de áudio para um caso de uso específico. Cada modo altera o comportamento do AGC, cancelamento de eco e codecs. Os modos não substituem a categoria, mas a complementam — uma categoria pode funcionar com diferentes modos.
As opções fornecem ajuste fino do comportamento da sessão. Cada opção é uma flag que pode ser combinada com outras em um array. Por exemplo, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] permite a saída de som para um fone Bluetooth, usa o alto-falante por padrão e se mistura com audiolivros.
No iOS 17+, surgiu a opção spatialAudio, que ativa o áudio espacial personalizado para AirPods através do AVAudioSessionSpatialPreferences. Segundo a WWDC 2024, o áudio espacial aumenta o engajamento dos usuários em aplicativos de música em 25% nos testes da Apple.
As interrupções são uma diferença chave entre Audio Session e Android Audio Focus. No iOS, as interrupções são tratadas através do NotificationCenter assinando o AVAudioSession.interruptionNotification. A notificação contém um dicionário com o tipo de interrupção: began ou 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()
}
}
Ao receber interruptionType.began, o player deve pausar a reprodução. Ao receber interruptionType.ended, a propriedade interruptionOptionKey indica se o player pode retomar automaticamente (shouldResume). Se o usuário recusou a chamada, shouldResume = true. Se a chamada terminou por tempo limite — shouldResume = false, a retomada não é permitida.
Quando outro aplicativo ativa seu Audio Session com a categoria playback, a sessão atual recebe uma notificação de interrupção. Se outro aplicativo usar ambient, nenhuma interrupção ocorre — os sons são misturados. Este comportamento é drasticamente diferente do Android, onde qualquer ativação do Audio Focus desencadeia um evento LOSS.
Para aplicativos que precisam continuar a reprodução quando outras sessões são ativadas (por exemplo, navegação enquanto a música toca), use a opção .mixWithOthers. Esta opção permite a mistura de som com outros aplicativos e nenhuma interrupção é enviada. MixWithOthers é o equivalente iOS do modo duck no Android.
O Audio Session gerencia automaticamente o roteamento de áudio entre alto-falantes integrados, fones de ouvido, headsets Bluetooth e dispositivos AirPlay. O aplicativo pode monitorar a rota atual através da propriedade currentRoute e receber notificações sobre mudanças via AVAudioSession.routeChangeNotification.
Quando fones Bluetooth são conectados, o iOS alterna automaticamente a saída de áudio para eles se a sessão estiver configurada com a opção allowBluetooth. Sem esta opção, o som continua pelo alto-falante integrado. A partir do iOS 16, ao conectar AirPods Pro, o sistema ativa automaticamente a sincronização ProMotion para reduzir a latência.
Assinar o routeChangeNotification permite reagir à conexão e desconexão de fones. Quando um headset Bluetooth é desconectado, o player deve pausar a reprodução — o usuário pode não esperar que o som comece a sair do alto-falante do telefone. De acordo com as Apple HIG (2026), este é um comportamento obrigatório para aplicativos de música.
As propriedades availableInputs e availableOutputs retornam uma lista de dispositivos de áudio disponíveis com seus tipos (builtInSpeaker, headphones, bluetoothA2DP, hdmi). O desenvolvedor pode selecionar programaticamente um dispositivo específico através do overrideOutputAudioPort para cenários de roteamento personalizados.
Perguntas Frequentes
A diferença principal é a arquitetura. Audio Session é uma única sessão centralizada por aplicativo que é configurada uma vez. O Audio Focus no Android requer solicitação manual de foco cada vez que reproduz. Além disso, o iOS suporta mixagem através da opção mixWithOthers, enquanto no Android duck é a única alternativa à parada completa.
A causa mais comum é uma categoria incorreta do Audio Session. Se ambient ou soloAmbient for selecionado, o som para quando a tela é bloqueada. Mude a categoria para playback e certifique-se de que Background Modes — Audio, AirPlay, and Picture in Picture está adicionado ao Info.plist.
Adicione a opção .mixWithOthers ao setCategory. Isso permitirá misturar o som do seu aplicativo com outras sessões ativas. Sem esta opção, um novo aplicativo interrompe o atual. MixWithOthers é o análogo do modo duck no Android, mas com preservação total do volume.
Use overrideOutputAudioPort com nil para seleção automática. Para saída forçada ao Bluetooth: obtenha o AVAudioSessionRouteDescription do availableOutputs, selecione uma porta com o tipo .bluetoothA2DP e passe-a ao overrideOutputAudioPort. Certifique-se de que a sessão está configurada com allowBluetooth.
Para a maioria dos aplicativos — sim. Desativar a sessão ao pausar permite que outros aplicativos obtenham o foco de áudio. A exceção são players de música com reprodução prolongada em segundo plano. Se a pausa for curta (menos de 5 segundos), é melhor manter a sessão ativa para retomada rápida.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também