iOS AVAudioSession中断通知不按预期工作

我想知道什么时候我的AVAudioRecorder无法访问(例如,当音乐开始播放)。

由于audioRecorderEndInterruption将被弃用与iOS 9我专注于AVAudioSession的中断通知(但都没有按预期工作)。

问题是,如果应用程序在中断发生时仍处于前台,中断通知从不会被调用。

例如:用户启动和停止播放音乐,而不将应用程序移动到后台。

要检测我正在使用的任何中断:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:nil]; ... - (void)audioSessionWasInterrupted:(NSNotification *)notification { if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) { NSLog(@"Interruption notification"); if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) { NSLog(@"InterruptionTypeBegan"); } else { NSLog(@"InterruptionTypeEnded"); } } } 

如预期的那样,我得到InterruptionTypeBegan ,但是如果应用程序仍处于前台(即在应用程序放置在后台并返回前台之前不会调用),则不会调用InterruptionTypeEnded

在应用程序处于前台时发生中断时,如何接收InterruptionTypeEnded通知?

这是一个普遍的问题,影响任何使用AV框架组件的应用程序(本地iOS应用程序也是如此)。

正如在关于audio中断主题的文档中所解释的那样, InterruptionTypeEnded实际上应该应用在所提到的场景中:

如果用户驳回中断…系统将调用您的回叫方法,表明中断已经结束。

但是,它也表示InterruptionTypeEnded可能根本不会被调用:

不能保证开始中断将会终止中断。

因此,在上述情况下需要采取不同的方法。


当处理音乐中断时,问题不会持续很长时间。 当应用程序的audio处理程序被调用时,iOS 9有效地防止外部audio源被使用。

一个处理媒体中断的确切问题的方法可能是监听MPMusicPlayerControllerplaybackState ,如下面的stackoverflow问题所示: 检测音乐是否正在播放? 。


处理中断问题的更直接的方法是:

InterruptionTypeBegan时间通过重新调用audio组件完全阻止audioInterruptionTypeBegan

或者通过提供UI指示,说明外部媒体源已经中断了audio会话(例如,显示不活动的麦克风)。


希望会提出一个更好的解决scheme,但同时这应该给你一些select来解决中断问题。

如果你还没有,尝试设置你的AVCaptureSession的属性usesApplicationAudioSessionNO

如果您正在寻找更多的细节, 这个问题和答案可能是一个很好的参考。

我试试这个,发现InterruptionTypeEnded可能会在一些应用程序中暂停音乐之后调用,但是其他的暂停时不会调用。

我的解决scheme是更新用户界面,让用户知道logging已停止并执行一些相关的工作,如文件操作。 当中断结束时,激活AVAudioSession, 如果没有错误 ,则开始新的logging。

如果你想join中断前后的文件,这个问题的答案是: AVAudioRecorder只logging中断后的audio可能对你有帮助。