当应用程序在前台播放声音,屏幕被locking – iOS

前言:我正在构build一个闹钟应用程序。 许多其他闹钟应用程序(如闹钟专业版)可以在屏幕locking并且应用程序处于前台时发出警报。 他们的闹钟可以播放无限的时间,并可以使用系统音量逐渐增加音量。 他们也没有控制音乐控制(如果你打开多任务屏幕,滚动到播放audio,你将看不到他们的图标)

我有一些麻烦重现该function。

要在应用程序处于前台时播放闹钟,我们将启动本地通知,这非常有效。 我已经有一些有限的成功,而屏幕被locking(和应用程序处于非活动状态)

我使用了以下方法:

  1. 当屏幕被locking时,每秒用后台任务运行NSTimer 。 我设法保持应用程序超过10分钟的最大值,但我无法播放声音。 当时间到了

  2. 使用AVAudioPlayer播放1秒无声的声音。 当声音结束时,重播声音并检查应用程序是否处于非活动(locking屏幕)状态。 如果处于locking屏幕状态,则需要播放闹钟。 这里的问题是我必须使用

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

以便在后台继续更新歌曲。 该方法将在音乐控件中显示“唤醒”,并会停止正在播放的任何我们想要避免的音乐。

  1. #1和#2的组合。 当应用程序打开无限重复播放沉默的声音。 当屏幕被locking时,触发定时器来检查是否有时间发出警报。 当需要播放闹钟时,将无声的声音切换到闹钟声。 该系统最终将强制closures该应用程序

已经帮助但尚未解决我的问题的相关知识:

  1. 如何在静音模式下开始播放audio并locking在iOS 6中?
  2. iOS 5深度睡眠预防
  3. 当应用程序处于后台时,继续中断代码的执行
  4. 如何播放背景iPhone SDK中的音乐

总结:当屏幕被locking,并在应用程序在前台,我无法防止过程中10分钟后被杀死。

UPDATE

我结束了使用https://github.com/mruegenberg/MMPDeepSleepPreventer ,让我发挥10分钟后的声音。 但是,这样吃起来就像疯了一样。 我需要find一个更有效的解决scheme。

更新2

我从应用程序商店下载了一些http://marcopeluso.com/应用程序。 他是深度睡眠预防者的创造者。 我下载了他的一些应用程序,并进行了一些仪器testing,看到他的应用程序没有像我的应用程序那样耗尽电量(据他的博客声称每小时大概为2.5%)。 我非常肯定,我需要优化我的应用程序,电池消耗问题将消失,我的问题将得到解决!

更新3我结束了使用https://github.com/mruegenberg/MMPDeepSleepPreventer

我在它自己的单独的xCode项目中运行它,当应用程序在后台时它只使用0.5%的cpu。 事实certificate,这是我的应用程序吸吮CPU。 所以它现在运作良好:)

即使您的应用程序在设备处于开启状态时处于前景状态,但在locking之后,它将转到后台(将调用willresignactive)。 现在从我在互联网上收集的东西,你不应该自己循环声音,而是提供在您的主要应用程序包中的这些格式之一的自定义音乐文件:

  • 线性PCM
  • MA4(IMA / ADPCM)
  • μLaw
  • 一条法律

自定义声音只能是30秒或更less。 在初始化你的UILocalNotification对象之后,你需要设置它的被触发属性,这个属性是date和时间(也是循环的)来触发通知 。 然后通过alertBody(如“唤醒”)和警报button上的string通过alertAction设置警报消息。 自定义声音的文件名进入soundName属性。 您通过调用scheduleLocalNotification:UIApplication方法来呈现您的通知实例。 请注意,您调用此方法的时间不需要,通常也不是,通知将触发的时间 。即使您设置了定期通知,您也只需要调用一次即可。您可以通过调用cancelLocalNotification来取消它: 。 现在你的闹钟应该玩,无论你的应用程序是在前景,背景还是不开放。

这一切都在这里 。

看到我上面的回应。 基本上,但

我结束了使用https://github.com/mruegenberg/MMPDeepSleepPreventer

我在它自己的单独的xCode项目中运行它,当应用程序在后台时它只使用0.5%的cpu。 原来,这是我的代码是杀死CPU。 一切都很好!