gpt4 book ai didi

iphone - 如果没有打开 kAudioSessionProperty_OverrideCategoryMixWithOthers,iOS 5 音频警报不会响起

转载 作者:行者123 更新时间:2023-12-03 19:44:32 25 4
gpt4 key购买 nike

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

自然,大量的支持请求因 iOS 5 的变化而涌入。我通过设置 kAudioSessionProperty_OverrideCategoryMixWithOthers 暂时解决了这个问题,让警报音频通过,但这样做会产生一些非常不良的副作用:

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

以上缺点对于我的应用程序的要求来说都是 Not Acceptable 。我已经研究这个问题有一段时间了,但一直没能破解它。如何设置我的音频:

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

最佳答案

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

我启动了一个 iOS 警报,然后在 audioPlayerBeginInterruption: 中放置了一个断点,并在调试器中逐行跟踪我的代码。我注意到在我的代码运行之前(当我在调试器中暂停时),iOS 5 警报响起了!幸运的是,即使当我单步执行我的应用程序时,它仍然听起来,所以我能够找出哪些代码片段专门导致它停止发声。

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

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

docs说明 prepareToPlay 方法

preloads buffers and acquires the audio hardware needed for playback, which minimizes the lag between calling the play method and the start of sound output.

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

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

<小时/>

TL;DR

stop声音代码逻辑中删除prepareToPlay调用。稍后启动将花费一微秒的时间,但允许声音中断。

关于iphone - 如果没有打开 kAudioSessionProperty_OverrideCategoryMixWithOthers,iOS 5 音频警报不会响起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8202604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com