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

iOS AVAudioSession中断通知未按预期工作,ios,avfoundation,interrupt,avaudiorecorder,avaudiosession,Ios,Avfoundation,Interrupt,Avaudiorecorder,Avaudiosession,我想知道我的AVAudioRecorder何时无法访问(例如音乐开始播放时) 由于iOS 9将不推荐使用audioRecorderEndInterruption,因此我将重点关注AVAudioSession的中断通知(但两者均未按预期工作) 问题在于,如果应用程序在中断发生时一直处于前台,则不会调用中断通知 例如:用户在不将应用程序移动到后台的情况下启动和停止播放音乐 要检测我正在使用的任何中断,请执行以下操作: [[NSNotificationCenter defaultCenter] add

我想知道我的
AVAudioRecorder
何时无法访问(例如音乐开始播放时)

由于iOS 9将不推荐使用
audioRecorderEndInterruption
,因此我将重点关注
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");
        }
    }
}
我得到了预期的
interruptiontypebegind
,但是如果应用程序仍在前台,则不会调用
interruptiontypeend
(这意味着在将应用程序置于后台并返回前台之前不会调用它)


当应用程序在前台时发生中断时,我如何才能收到中断类型的通知?

如果您还没有,请尝试将您的
AVCaptureSession
属性
usesApplicationAudioSession
设置为


如果您想了解更多详细信息,问答可以作为一个很好的参考。

我尝试了一下,发现在某些应用程序中,音乐暂停后可能会调用中断类型,但暂停时不会调用其他类型

我的解决方案是更新UI,让用户知道记录已停止,并执行一些相关工作,如文件操作。当中断结束时,激活的音频会话,如果没有错误,则开始新记录


如果您想在中断前后加入文件,此问题的答案:可能对您有帮助。

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

如中关于音频中断主题所述,
interruptiontyped
应实际应用于所述场景:

如果用户取消了中断。。。系统调用回调方法,指示中断已结束

但是,它还声明可能根本不会调用
中断类型

不能保证开始中断会有结束中断

因此,在上述场景中需要一种不同的方法


当涉及到处理音乐中断时,这个问题不会持续很久。iOS 9有效地防止在调用应用程序的音频处理程序时使用外部音频源

处理媒体中断的确切问题的一种方法是收听
MPMusicLayerController
playbackState
,如此stackoverflow问题所示:


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

通过在中断类型开始时重新调用音频组件,完全阻止外部音频中断

或者通过给出外部媒体源中断音频会话的UI指示(例如,显示不活动的麦克风)



但愿 将提出更好的问题解决方案,但同时这将为您提供一些解决中断问题的选项。

此链接可能会帮助您:-来自apple文档:“不能保证开始中断会有结束中断。您的应用程序需要注意切换到前台运行状态或用户按下播放按钮。在这两种情况下,请确定应用程序是否应重新激活其音频会话。他说:"虽然这个连结可以回答问题,但最好在这里加入答案的主要部分,并提供连结供参考。如果链接页面更改,仅链接的答案可能无效。感谢您的反馈@LeftyX我没有考虑您的问题,从现在起我的答案中将考虑到这一点。我有点困惑,为什么我的回答被否决了,因为它确实包含了一个有效的解决方案。我没有否决投票。我几乎不反对投票。最好在你的回答中给出一个完整的解释。@LeftyX我不是有意暗示你有。再次感谢,从现在起,我一定会在我的回复中详细解释。谢谢@Aleksander Azizi!顺便说一句,你能解释一下“通过在中断类型开始时重新调用音频组件完全阻止外部音频中断”的更多信息吗?@nahung89调用
interruptiontypebegind
后,你可以再次初始化音频引擎。情感上屏蔽任何其他音频源。我明白了。事实上我以前试过,但没用。电话/闹钟/提醒。。。在音频会话中始终具有更高的优先级。在我们再次设置音频播放器之后,它将立即停止。我发现在中断处理程序中无法调用.play(),因为这会阻止调用audioPlayerEndInterruption。只有在audioPlayerEndInterruption()中调用.play()才能使resume正常工作。有关详细信息,请查看我的对话。另一个解决方法是收听路线更改通知。如果您有一个不匹配的BeginInterruption,并且路由发生更改,则可以尝试重新启动。