前言:我正在构建一个闹钟应用程序。许多其他警报应用程序(如闹钟专业版)能够在屏幕锁定且应用程序位于前台时播放警报。它们的警报可以无限制地播放,并且可以使用系统音量逐渐增加音量。他们也没有控制音乐控件(如果你打开多任务屏幕并滚动播放音频,你将看不到他们的图标)
我在复制该功能时遇到了一些麻烦。
要在应用程序位于前台时播放闹钟,我们会触发本地通知,效果很好。屏幕锁定时,我的成功有限(应用程序处于非活动状态)
我使用了以下方法:
屏幕锁定时,每秒使用后台任务运行NSTimer
。我设法保持应用程序打开超过10分钟,但我无法播放声音。什么时候来了
使用AVAudioPlayer
播放1秒无声音。当声音结束时,重播声音并检查应用程序是否处于非活动(锁定屏幕)状态。如果它处于锁定屏幕状态并且是时候播放闹钟,请播放它。这里的问题是我必须使用
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
以便在后台继续更新歌曲。该方法将在音乐控件中显示Wake,并将停止我们想要避免的任何当前播放的音乐。
相关知识有帮助但尚未解决我的问题:
摘要:当屏幕被锁定且应用程序位于前台时,我无法阻止该过程在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。所以它现在运作良好:)
答案 0 :(得分:1)
即使您的应用在设备开启时处于前台,但在锁定之后它将转到后台(将调用resresignactive)。 现在,从我在互联网上收集的内容来看,您不应该自己循环播放声音,而是在主应用程序包中以其中一种格式提供自定义音乐文件:
自定义声音只能是30秒或更短。 初始化UILocalNotification对象后,您需要设置其fireate属性,即触发通知的日期和时间(也是重复出现)。 然后通过alertBody设置警报消息(如“唤醒”),并通过alertAction设置警报按钮上的字符串。自定义声音的文件名将进入soundName属性。 您通过调用scheduleLocalNotification:(UIApplication方法)来显示通知实例。 请注意,您调用此方法的时间不一定是,通常不是通知触发的时间。即使您设置了定期通知,也只需要调用一次。你通过调用cancelLocalNotification取消它:。现在,无论您的应用程序处于前台,后台还是不打开,您的闹钟都应该播放。
全部都在here。
答案 1 :(得分:1)
请参阅上面的回复。基本上虽然
我最终使用https://github.com/mruegenberg/MMPDeepSleepPreventer
我在它自己独立的xCode项目中运行它,当应用程序在后台时它只使用0.5%的cpu。事实证明,这是我的代码杀死了cpu。一切都很好!