当应用程序启动并将委托设置为 appDelegate 时,我正在设置一个 AVAudioSession。一切似乎都在工作(播放等),除了当电话接到电话时没有调用代表上的 beginInterruption 。当呼叫结束时 endInterruption 正在被调用。
我唯一的想法是我使用的音频播放器代码曾经基于 AVAudioPlayer,但现在使用的是 AVPlayer。用于处理中断的 AVAudioPlayer 委托的回调仍然存在,但它们会以任何方式发生冲突似乎很奇怪。
当应用程序启动并将委托设置为 appDelegate 时,我正在设置一个 AVAudioSession。一切似乎都在工作(播放等),除了当电话接到电话时没有调用代表上的 beginInterruption 。当呼叫结束时 endInterruption 正在被调用。
我唯一的想法是我使用的音频播放器代码曾经基于 AVAudioPlayer,但现在使用的是 AVPlayer。用于处理中断的 AVAudioPlayer 委托的回调仍然存在,但它们会以任何方式发生冲突似乎很奇怪。
查看标题,在 iOS6 中,看起来 AVAudioSessionDelegate 现在已被弃用。
AVAudioSessionInterruptionNotification
在 iOS6 中改用。
更新:那没有用。我认为框架中存在错误。
是的,根据我的经验,beginInterruption 和新记录的 AVAudioSessionInterruptionNotification 都不能正常工作。我必须做的是使用本地标志跟踪播放器的状态,然后处理该endInterruption:withFlags:
方法以跟踪中断的恢复。
在 iOS 6 中,从中断中恢复至少会使您的 AudioPlayer 保持在正确的位置,因此我无需存储我的 AVAudioPlayer 的最后已知播放时间,我只需点击播放即可。
这是我想出的解决方案。如果 AVPlayer 驻留时间过长,iOS 6 似乎会通过 Media Reset 杀死您的音频。最终发生的是 AVPlayer 播放,但没有声音出来。AVPlayer 上的速率为 1,但绝对没有声音。更糟糕的是,AVAudioSession setActive 和 AVPlayer 本身都没有错误表明存在问题。
再加上您不能依赖 appWillResignActive 的事实,因为如果您完全依赖远程控制手势,您的应用程序可能已经在后台。
我实现的最终解决方案是在 AVPlayer 上添加一个周期性观察者,并记录最后一次已知时间。当我收到我已获得控制权的事件时,我创建了一个新的 AVPlayer,使用 AVPlayerItem 加载它,并将 seekToTime 设置到适当的时间。
这是一个非常烦人的解决方法,但至少它有效,并且避免了正在发生的周期性崩溃。
我可以确认使用C api,中断开始时也没有调用中断方法;只有当它结束时
(AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self));
我还针对该问题向苹果提交了错误报告。
编辑:这在 iOS 6.1 中已修复(但不是 iOS 6.0.1)
只需致电:
[[AVAudioSession sharedInstance] setDelegate: self];
我刚刚通过在 AudioSessionInitialize() 中声明的 AudioSessionInterruptionListener 回调函数中设置断点检查了我的 iPhone 5(运行 iOS 6.0),实际上,当应用程序具有活动的音频会话和音频时,会调用此中断回调单元并被来电打断(Xcode 显示应用程序在中断开始时的断点处停止,然后我从该断点继续)。
我有该应用程序,然后停止其音频单元并停用其音频会话。然后,在结束中断回调时,应用程序重新激活音频会话并重新启动音频单元而没有问题(应用程序随后正确录制音频)。
AVPlayer
我在 iOS 6.0.x 上构建了一个全新的音频流 ( ) 应用程序,发现了同样的问题。
代表现在已弃用,我们必须使用通知,这很好,但这是我的发现:
AVAudioSessionInterruptionTypeEnded
我的处理程序,以及AVAudioSessionInterruptionOptionShouldResume
. 音频会话自动暂停(音频淡出),我只需要恢复播放AVPlayer
.AVAudioSessionInterruptionTypeBegan
当我的应用程序可以恢复播放,甚至没有终止游戏时,我会感到恐惧但没有任何迹象。现在,这可能取决于其他因素,例如我的音频类别(在我的情况下AVAudioSessionCategoryPlayback
)和两个应用程序的混合设置(kAudioSessionProperty_OverrideCategoryMixWithOthers
),我不确定,但肯定我看到了一些不合适的地方。
希望其他人报告说,在 6.1beta 上,这是修复的,我还需要升级,所以我们拭目以待。