Saída de áudio para chamadas (iOS)

Para permitir a alternância contínua da saída de áudio em seu aplicativo, é recomendável integrar a robusta estrutura CallKit da Apple. O CallKit permite que seu aplicativo gerencie serviços de chamada com eficiência, garantindo uma experiência de usuário tranquila. Consulte a documentação oficial da Apple sobre o CallKit aqui.

Integração do CallKit

Para obter orientações completas sobre como integrar o CallKit ao seu projeto e aproveitar todo o seu potencial, consulte Notificações push.

Rotas atuais de saída de áudio

Para obter as fontes de saída de áudio disponíveis no momento, você pode utilizar AVAudioSession's currentRoute.outputs propriedade. Isso exibirá uma lista de todas as fontes de saída disponíveis no momento.

let outputs = AVAudioSession.sharedInstance().currentRoute.outputs
outputs.forEach { audioSource in
                switch audioSource.portType {
                case .headphones:
                    print("headphones are used")
                case .bluetoothA2DP:
                    print("Bluetooth audio is connected")
                case .builtInSpeaker:
                    print("speaker is used")
                case .builtInReceiver:
                    print("earpiece is used")
                default:
                    print("other output: \(audioSource.portType.rawValue)")
                }
            }

Você também pode substituir a fonte de saída de áudio usando o seguinte trecho de código:

// highlight-next-line
AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)

Recomendamos evitar definir ou substituir as configurações de áudio por meio de CallKit para uma experiência melhor.

Observando as alterações na saída de áudio

Você pode se inscrever no AVAudioSession.routeChangeNotification notificação para acompanhar as alterações na saída de áudio. Veja como fazer isso:

var cancelable: AnyCancellable?

func observeAudioRouteChanges() {
    self.cancelable = NotificationCenter.default.publisher(for: AVAudioSession.routeChangeNotification).sink { notification in
            /// process notification's user Info, to get audio change information
    }
}

func removeAudioRouteChangesObserver() {
    cancelable?.cancel()
}