在endInterruption调用AVAudioSessionDelegate,但不调用beginInterruption

当应用程序启动并将代理设置为appDelegate时,我正在设置AVAudioSession。 似乎一切似乎正在工作(播放等),除了在代表的beginInterruption没有被调用时,电话接到一个电话。 当通话结束endInterruption正在被调用。

我唯一的想法是,我使用的audio播放器代码基于AVAudioPlayer,但现在使用AVPlayer。 AVAudioPlayer委托处理中断的callback函数仍然存在,但是看起来很奇怪,它们会以任何方式冲突。

看看头,在iOS6,它看起来像AVAudioSessionDelegate现在已被弃用。

请在iOS6中使用AVAudioSessionInterruptionNotification。

更新:这没有奏效。 我认为这个框架有一个bug。

是的,根据我的经验,beginInterruption,也没有新logging的AVAudioSessionInterruptionNotification正常工作。 我所要做的就是使用本地标志跟踪播放器的状态,然后处理endInterruption:withFlags:方法,以便跟踪中断的恢复。

使用iOS 6时,从中断恢复至less可以让您的AudioPlayer保持在正确的位置,所以我不需要存储AVAudioPlayer的最后已知播放时间,我只需点击播放。

这是我想出的解决scheme。 如果AVPlayer保持驻留时间过长,iOS 6似乎会使用Media Reset杀死audio。 最后发生的事情是,AVPlayer播放,但没有声音出来。 AVPlayer上的速率是1,但绝对没有声音。 为了增加痛苦,AVAudioSession setActive和AVPlayer本身都没有错误,表明存在问题。

添加到你不能依靠appWillResignActive的事实,因为你的应用程序可能已经在后台,如果你依赖远程控制手势。

我实现的最终解决scheme是在AVPlayer上添加一个定期的观察者,并logging最后的已知时间。 当我收到我已经得到控制的事件时,我创build一个新的AVPlayer,加载AVPlayerItem和seekToTime到适当的时间。

这是一个相当恼人的解决方法,但至less可以工作,并避免发生定期崩溃。

我可以确认使用C api,中断开始时也不会调用中断方法; 只有当它结束

 (AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self)); 

我也为这个问题提交了一个关于苹果的bug报告。

编辑:这是固定在iOS 6.1(但不是iOS 6.0.1)

只要打电话:

 [[AVAudioSession sharedInstance] setDelegate: self]; 

我只是通过在AudioSessionInitialize()中声明的AudioSessionInterruptionListenercallback函数中设置断点来检查我的iPhone 5(运行iOS 6.0),并且实际上,当应用程序具有活动的audio会话和audio单位,并打来电话(Xcode显示应用程序停止在中断开始的断点,然后我继续)。

我有应用程序,然后停止其audio单元,并取消激活其audio会话。 然后,在结束中断callback时,应用程序重新激活audio会话,并重新启动audio单元没有问题(应用程序正在录制audio后)。

我在iOS 6.0.x上创build了一个全新的audiostream( AVPlayer )应用程序,并发现了同样的问题。

代表已被弃用,我们必须使用通知,这是很好的,但是这是我的发现:

  1. 在来电打电话时,我的处理程序中只有AVAudioSessionInterruptionTypeEndedAVAudioSessionInterruptionOptionShouldResume 。 audio会话自动暂停(audio淡入淡出),我只需要恢复播放AVPlayer
  2. 然而,当试图发布一个游戏,比如CSR Racing,我奇怪地得到了可怕的AVAudioSessionInterruptionTypeBegan但是当我的应用程序可以恢复播放,甚至没有杀死游戏时,我就没有任何迹象。

现在,这可能取决于其他因素,如我的audio类别(在我的情况下AVAudioSessionCategoryPlayback )和两个应用程序( kAudioSessionProperty_OverrideCategoryMixWithOthers )的混音设置,我不知道,但肯定我看到的东西kAudioSessionProperty_OverrideCategoryMixWithOthers的地方。

希望别人报告6.1beta这是固定的,我还没有升级,所以我们会看到。