19

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

我在重现该功能时遇到了一些麻烦。

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

我使用了以下方法:

  1. NSTimer屏幕锁定时每秒运行一次后台任务。我设法让应用程序在最长 10 分钟后保持打开状态,但我无法播放声音。时间到了

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

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

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

  1. #1 和 #2 的组合。当应用程序打开时,无限重复播放无声的声音。当屏幕被锁定时,会触发一个计时器来检查是否是时候播放警报了。当需要播放警报时,将静音声音切换为警报声音。系统最终会强制关闭应用程序

有帮助但没有解决我的问题的相关知识:

  1. 如何在静音模式下开始播放音频并锁定在 iOS 6 中?
  2. iOS 5 深度睡眠预防
  3. 应用程序在后台时中断后恢复执行代码
  4. 如何在后台播放音乐 iphone sdk

摘要:当屏幕被锁定并且应用程序处于前台时,我无法阻止该进程在 10 分钟标记后被终止。

更新

我最终使用了https://github.com/mruegenberg/MMPDeepSleepPreventer让我在 10 分钟后播放声音。但是,这会像疯了一样消耗电池。我需要找到更有效的解决方案。

更新 2

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

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

我在它自己单独的 xCode 项目中运行它,当应用程序在后台时它只使用 0.5% 的 cpu。原来是我的应用程序在吸cpu。所以现在一切都很好:)

4

2 回答 2

1

见我上面的回复。基本上虽然

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

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

于 2013-03-31T18:08:12.760 回答
1

即使您的应用在设备打开时处于前台,在它被锁定后它也会进入后台(调用 willresignactive)。现在根据我在互联网上收集的信息,您不应该自己循环播放声音,而是在您的主应用程序包中提供以下格式之一的自定义音乐文件:

  • 线性PCM
  • MA4 (IMA/ADPCM)
  • 微定律
  • 一条法律

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

都在这里

于 2013-03-13T20:01:04.497 回答