如果没有 kAudioSessionProperty_OverrideCategoryMixWithOthers On,iOS 5 音频警报不会响起

Posted

技术标签:

【中文标题】如果没有 kAudioSessionProperty_OverrideCategoryMixWithOthers On,iOS 5 音频警报不会响起【英文标题】:iOS 5 Audio Alarms Don't Sound Without kAudioSessionProperty_OverrideCategoryMixWithOthers On 【发布时间】:2011-11-20 15:38:12 【问题描述】:

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

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

其他应用的音频可以用我的/在我的上面播放。 远程控制事件不会路由到我的应用,而是路由到 iPod.app。

以上缺点都不符合我的应用要求。我已经破解了一段时间,但一直无法破解它。如何设置我的音频:

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

【问题讨论】:

【参考方案1】:

写完这个问题后,我去提交了一份关于这个问题的错误报告。我创建了一个小的sample project,我认为它会复制这个问题,但我无法复制它!这让我再次深入挖掘并试图弄清楚这里是什么......

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

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

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

docs 声明 prepareToPlay 方法

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

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

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


TL;DR

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

【讨论】:

以上是关于如果没有 kAudioSessionProperty_OverrideCategoryMixWithOthers On,iOS 5 音频警报不会响起的主要内容,如果未能解决你的问题,请参考以下文章

如果函数没有明确使用'ret',为啥没有返回值

如果用户没有与动画交互,Actionscript 3 执行一个动作

如果没有你

如果流没有手动关闭,它啥时候关闭?

UIPageViewController - 如果没有页面,则不允许移动

Bootstrap4 中的“警报”是不是阻塞?如果没有,有没有办法这样做?