Вам необходимо изменить outputDataSources, так как когда вы переопределяете его,
теперь он содержит только параметр .Speaker
В документации вы можете найти решение этой проблемы,
Если ваше приложение использует категорию playAndRecord, то при вызове этого метода с параметром AVAudioSession.PortOverride.speaker звук будет перенаправлен на встроенный динамик и микрофон независимо от других настроек.Это изменение остается в силе только до тех пор, пока не изменится текущий маршрут или пока вы не вызовете этот метод снова с параметром AVAudioSession.PortOverride.none.
Поэтому звук направляется на встроенный динамик. Это изменение остаетсяв действительности только до тех пор, пока не изменится текущий маршрут, или вы снова вызываете этот метод с помощью .noneOption
.
невозможно принудительно направить звук на наушники, если аксессуар не подключен к разъему для наушников (который активирует физический переключатель для передачи голоса на наушники).
Поэтому, когда вы хотите переключиться обратно нанаушники, это должно работать.И если нет подключенных наушников, переключите устройство вывода на выход маленького динамика в верхней части устройства вместо большого динамика.
let session: AVAudioSession = AVAudioSession.sharedInstance()
do {
try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
try session.overrideOutputAudioPort(AVAudioSession.PortOverride.none)
try session.setActive(true)
} catch {
print("Couldn't override output audio port")
}
Прочтите об этом AVAdioSession / OverrideOutputAudioPort Здесь .
Вы можете проверить, подключена ли гарнитура, добавив это расширение,
extension AVAudioSession {
static var isHeadphonesConnected: Bool {
return sharedInstance().isHeadphonesConnected
}
var isHeadphonesConnected: Bool {
return !currentRoute.outputs.filter { $0.isHeadphones }.isEmpty
}
}
extension AVAudioSessionPortDescription {
var isHeadphones: Bool {
return portType == AVAudioSessionPortHeadphones
}
}
И просто использовать эту строку кода
session.isHeadphonesConnected