Ios 音频中断

Ios 音频中断,ios,audio,avaudiosession,interruption,Ios,Audio,Avaudiosession,Interruption,因此,在我的应用程序中,在iOS 6上运行,一切似乎都与音频配合良好。我使用旧的C API格式通过回调捕捉中断;通过:AudioSessionInitialize(NULL,NULL,interruptonListenerCallback,(\uu bridge void*)self)设置,非常棒。不过,使用iOS 7 SDK,当设备收到呼叫或警报响起时,似乎从未调用我的中断回调 环顾四周之后,我听说旧的C api已被弃用,您应该转向更新的AVAudioSession函数。更多阅读表明,AVAu

因此,在我的应用程序中,在iOS 6上运行,一切似乎都与音频配合良好。我使用旧的C API格式通过回调捕捉中断;通过:
AudioSessionInitialize(NULL,NULL,interruptonListenerCallback,(\uu bridge void*)self)设置
,非常棒。不过,使用iOS 7 SDK,当设备收到呼叫或警报响起时,似乎从未调用我的中断回调

环顾四周之后,我听说旧的C api已被弃用,您应该转向更新的AVAudioSession函数。更多阅读表明,AVAudioSession委托已被弃用,您应该使用
NSNotification
for
AVAudioSessionInterruptionNotification
捕捉中断并执行任何需要执行的操作

对我来说,这个通知似乎从来没有真正被触发过,因此我从来没有被适当地打断过,这会在通话结束后中断我所有的音频内容

我是这样注册通知的:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(AudioInterruption:) name:AVAudioSessionInterruptionNotification object:nil];
目前,
AudioInterruption:
函数只是记录它被触发的情况。日志和任何断点都不会触发


要明确的是,最初的音频播放和录制工作正常。当发生中断(如来电或警报)时,不会触发中断通知。如果需要更多的周边代码,请告诉我。

您没有将addObserver调用中的AVAudioSession实例作为最后一个参数传递

试试这个:

AVAudioSession *session = [AVAudioSession sharedInstance];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(AudioInterruption:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:session];
您的应用程序中是否有AVCaptureSession实例?
如果是这样的话,我会建议与我收到的链接问题相同的答案:
尝试将AVCaptureSession实例的属性设置为“否”。
它是自iOS 7以来可用的属性。在以前的iOS版本中,每个AVCaptureSession都使用私有AVAudioSession。自iOS 7以来,捕获会话使用共享应用程序的AVAudioSession。
默认情况下,该属性处于启用状态,因此如果要保留旧行为,必须通过设置“否”来禁用它


我希望这也能对您起作用。

对我来说,当用户实际按下播放按钮时,激活音频会话并添加观察者解决了问题;通知被触发。我认为apple doc对此有所说明。

作为一个要点,如果我手动发布
AVAudioSessionInterruptionNotification
,那么我的观察者就会触发,这样就可以了。仍然不知道系统为什么不发布通知。您是否设置了AVAudioSession模式并调用了
setActive
?是的,否则音频最初不会播放,它会播放<代码>[会话设置模式:AVAudioSessionModeVoiceChat错误:&error]和
[[AVAudioSession sharedInstance]设置活动:是错误:&activationError]
。我在添加观察者之前设置了模式,之后设置为活动,尽管这不重要(?)。您为音频类别设置了什么?我使用
AVAudioSessionCategoryPlayAndRecord
。无论选择什么,对选项进行试验都不会产生任何变化。传递会话不是必需的,它只是防止观察者从其他对象接收通知。以防万一,我将代码编辑为在会话中通过而不是零,这没有帮助。不过谢谢你的建议。我会在周一试试(或者如果周末有机会,我会跑到办公室早点试试)。交叉手指~这解决了我的问题!非常感谢你的帮助(记得在得到你自己的答案后把答案扔到这里)!如果
AVCaptureSession
?如果我创建
AVCaptureSession
的虚拟对象(不添加输入/输出),这会起作用吗?