当应用程序在前台并且屏幕被锁定时播放声音 - iOS

时间:2013-03-12 15:03:22

标签: iphone ios background screen locked

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

我在复制该功能时遇到了一些麻烦。

要在应用程序位于前台时播放闹钟,我们会触发本地通知,效果很好。屏幕锁定时,我的成功有限(应用程序处于非活动状态)

我使用了以下方法:

  1. 屏幕锁定时,每秒使用后台任务运行NSTimer。我设法保持应用程序打开超过10分钟,但我无法播放声音。什么时候来了

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

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

  3. 以便在后台继续更新歌曲。该方法将在音乐控件中显示Wake,并将停止我们想要避免的任何当前播放的音乐。

    1. #1和#2的组合。当应用程序打开时,无限重复播放无声音。当屏幕被锁定时,触发计时器以检查其是否有时间发出警报。在播放闹钟时,将静音声音切换为闹钟声音。该系统最终将强制关闭应用程序
    2. 相关知识有帮助但尚未解决我的问题:

      1. How do I start playing audio when in silent mode & locked in iOS 6?
      2. iOS 5 deep sleep prevention
      3. Resuming execution of code after interruption while app is in background
      4. How to play music in background iphone sdk
      5. 摘要:当屏幕被锁定且应用程序位于前台时,我无法阻止该过程在10分钟后被杀死。

        更新

        我最终使用https://github.com/mruegenberg/MMPDeepSleepPreventer让我在10分钟后发出声音。然而,这就像疯了一样吃掉电池。我需要找到一个更有效的解决方案。

        更新2

        我从应用商店下载了一些http://marcopeluso.com/个应用。他是Deep Sleep Preventer的创造者。我下载了他的一些应用程序,并进行了一些仪器测试,看到他的应用程序没有像我的应用程序那样消耗电池(他的博客上某处声称每小时大约2.5%)。我非常肯定我需要优化我的应用程序,电池耗尽问题将消失,我的问题将得到解决!

        更新3 我最终使用了https://github.com/mruegenberg/MMPDeepSleepPreventer

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

2 个答案:

答案 0 :(得分:1)

即使您的应用在设备开启时处于前台,但在锁定之后它将转到后台(将调用resresignactive)。 现在,从我在互联网上收集的内容来看,您不应该自己循环播放声音,而是在主应用程序包中以其中一种格式提供自定义音乐文件:

  • 线性PCM
  • MA4(IMA / ADPCM)
  • μLaw
  • ALAW

自定义声音只能是30秒或更短。 初始化UILocalNotification对象后,您需要设置其fireate属性,即触发通知的日期和时间(也是重复出现)。 然后通过alertBody设置警报消息(如“唤醒”),并通过alertAction设置警报按钮上的字符串。自定义声音的文件名将进入soundName属性。 您通过调用scheduleLocalNotification:(UIApplication方法)来显示通知实例。 请注意,您调用此方法的时间不一定是,通常不是通知触发的时间。即使您设置了定期通知,也只需要调用一次。你通过调用cancelLocalNotification取消它:。现在,无论您的应用程序处于前台,后台还是不打开,您的闹钟都应该播放。

全部都在here

答案 1 :(得分:1)

请参阅上面的回复。基本上虽然

我最终使用https://github.com/mruegenberg/MMPDeepSleepPreventer

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