3

我有一个音频应用程序在 iOS 5 更改音频行为的方式上存在一些问题。当我的应用程序的音频正在播放 ( AVAudioSessionCategoryPlayback) 并且从操作系统触发 Clock.app 警报或计时器时,会弹出 UIAlertView 通知,但没有音频警报。我的应用程序听起来不错,可以避开音频警报,但警报应用程序的音频警报没有响起。

自然地,大量的支持请求涌入了 iOS 5 的变化。我已经通过设置让警报音频通过来暂时kAudioSessionProperty_OverrideCategoryMixWithOthers解决了这个问题,但是这样做有一些非常不受欢迎的副作用:

  • 其他应用程序的音频可以与我的一起播放。
  • 远程控制事件不会路由到我的应用程序,而是路由到 iPod.app。

对于我的应用程序的要求,上述缺点都不可接受。我已经破解了一段时间,但一直无法破解它。如何设置我的音频:

  1. 我的应用程序的音频仍然使用AVAudioSessionCategoryPlayback背景音频类别。
  2. Clock.app 闹钟仍会发出声音警报
  3. 该应用程序仍然响应远程控制通知
4

1 回答 1

3

写完这个问题后,我去提交一个错误报告。我创建了一个小示例项目,我认为它会复制该问题,但我无法复制它!这让我再次深入挖掘并试图弄清楚这里是什么......</p>

我触发了 iOS 警报,然后在调试器中设置了一个断点audioPlayerBeginInterruption:并逐行跟踪我的代码。我注意到在我的代码运行之前(当我在调试器中暂停时),iOS 5 警报响起!幸运的是,即使在我逐步浏览我的应用程序时它仍然响起,所以我能够弄清楚是哪些代码特别导致它停止发声。

我的 interruptHandler 的一部分是(显然)停止我的应用程序的内部音频以让中断通过。我以前从没想过检查这种方法,但结果发现问题存在。我的 stop 方法会prepareToPlay在停止后立即调用,以使下次恢复更快。

[self.player stop];
[self.player prepareToPlay]; // <- iOS 5 alarm sound stopped here.

文档说明了prepareToPlay方法

预加载缓冲区并获取播放所需的音频硬件,从而最大限度地减少调用播放方法和开始声音输出之间的延迟。

听起来很合理,这适用于较小的 iOS 版本。我的假设是  必须对 Clock.app 警报系统进行了更改,以便新的警报声音使用硬件,而之前使用软件。这就是我认为导致 iOS 5 警报在某些应用程序中静音的原因。

删除prepareToPlay线路导致警报响起而不使用kAudioSessionProperty_OverrideCategoryMixWithOthers,从而解决了我在这个问题中提出的所有问题。


TL;博士

从您的声音代码逻辑中删除prepareToPlay调用。stop稍后开始将需要一微秒的时间,但会允许中断声音。

于 2011-11-20T17:47:59.183 回答