从 iOS 7 开始不推荐使用 AudioSessionSetProperty,我们应该使用 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 类别,请参阅该帖子:
如何在不使用 AudioSessionSetProperty 的情况下将音频路由到扬声器?