Поскольку AudioSessionSetProperty устарела с iOS 7, мы должны использовать AVFoundation AVAudioSession. Поскольку желаемое действие - разрешить пользовательскому действию переопределить маршрут через динамик, вы можете рассмотреть разницу между AVAudioSessionPortOverrideSpeaker и AVAudioSessionCategoryOptionDefaultToSpeaker.
Согласно Техническому бюллетеню Q & A QA1754: «При использовании AVAudioSessionCategoryOptionDefaultToSpeaker жесты пользователя будут учитываться. Например, подключение гарнитуры приведет к изменению маршрута на микрофон / наушники гарнитуры, а отключение гарнитуры приведет к изменению маршрута на встроенный микрофон / динамик ".
Обратите внимание, что в техническом бюллетене объясняется, что AVAudioSessionPortOverrideSpeaker будет более подходящим для использования, например, с кнопкой громкой связи, а это не то, о чем просил оригинальный пост.
https://developer.apple.com/library/ios/qa/qa1754/_index.html
Моя собственная реализация вызывается перед тем, как я вызываю проигрыватель, следующим образом:
NSError *error;
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
// handle any error
// initiate the player or recorder
[_player play];
Также этот вопрос похож на вопрос, рассмотренный в другом, но связанном посте.
В соответствии с тем же техническим бюллетенем, упомянутым здесь: «Подумайте об использовании overrideOutputAudioPort: с точки зрения того, что вы могли бы использовать для реализации кнопки громкой связи, где вы хотите иметь возможность переключения между динамиком (AVAudioSessionPortOverrideSpeaker) и обычным выходным маршрутом AVAudioSessionPortOverrideNone). "
Обратитесь к этому сообщению, если вы ищете реализацию категории overrideOutputPort override динамика:
Как маршрутизировать звук на динамик без использования AudioSessionSetProperty?