【问题标题】:Playing a sound while app is in the foreground and the screen is locked - iOS在应用程序处于前台并且屏幕被锁定时播放声音 - iOS
【发布时间】:2013-02-28 04:13:42
【问题描述】:

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

我在重现该功能时遇到了一些问题。

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

我使用了以下方法:

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

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

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

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

  1. #1 和#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

总结:当屏幕被锁定并且应用程序处于前台时,我无法阻止进程在 10 分钟后被杀死。

更新

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

更新 2

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

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

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

【问题讨论】:

  • 为了总结你的问题,你是否可以让它工作,但在屏幕锁定后最多只能工作 10 分钟?
  • 底部加粗总结,希望对您有所帮助
  • 我知道您的应用程序在前台,但您可以尝试使用“背景音乐”和“后台任务”来解决您的问题。可以在此处找到教程:mobile.tutsplus.com/tutorials/iphone/ios-sdk_background-audio 我假设前台进程在 10 分钟后停止以节省电池。
  • 这没有用,但它确实github.com/mruegenberg/MMPDeepSleepPreventer 但是!它非常消耗电池。我需要找到一种更有效的方法来做到这一点

标签: iphone ios background screen locked


【解决方案1】:

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

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

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

一切尽在here

【讨论】:

  • 嘿,感谢您的回复,但这不是我正在做的理想的解决方案。如果您使用过任何好的闹钟应用程序,当屏幕被锁定并且他们的应用程序处于前台时,无论您的系统设置音量和静音设置如何,都会播放警报。有一个使用本地通知和重复的合理解决方案,但它们不会提供出色的用户体验,因为用户必须确保应用程序在睡觉前不会被静音,从而使应用程序无法用作警报。
  • 我希望您能找到一种可靠的方法,让您的应用在设备锁定时不会被杀死。但即便如此,作为一个闹钟用户,我也不想记住打开你的应用程序(每次我关闭和打开设备时),否则闹钟将不会播放..
  • 最终找到了解决方案。我相当肯定,现在应用商店中有很多使用此功能的警报。请参阅我上面的评论。
【解决方案2】:

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

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

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

【讨论】:

  • 您看到多少电池消耗?我使用 MMPDeepSleepPreventer 在一夜之间失去了大约 20% 的电池电量 - 不确定这是否正常。你最终做了什么来让你的应用停止消耗电池?
  • 这听起来很对。这不是最好的解决方案,而是我能找到的唯一可行的解​​决方案。我修改了 MMPDeepSleepPreventer 以减少播放声音的频率,我相信每 9 分钟一次,因为该应用程序有 10 分钟的后台寿命。这可能会节省一些电池寿命,但我对此表示怀疑。
  • @gabe.roze 嗨 gabe.roze,我有同样的问题并尝试使用 MMPDeepSleepPreventer 类,但问题是如何区分按下主页按钮或按下电源按钮。因为如上所述,这些应用程序仅在按下电源按钮时工作,而不是在按下主页按钮时工作。我也想要应用程序的相同行为。你能帮帮我吗?
  • 我的应用程序不像大多数警报那样在后台运行。在 info.plist 中,我将 Application does not run in background 设置为 YES。当按下主页按钮时,我的应用程序被终止并且 MMPDeepSleepPreventer 什么也不做。按下锁定按钮时,启用 MMPDeepSleepPreventer。我在 applicationWillResignActive 下的 AppDelegate 中调用 MMPDeepSleepPreventer,在 applicationDidBecomeActive 中调用 [deepSleepPreventer stopPreventSleep] 我还在 didFinishLaunchingWithOptions 中初始化 MMPDeepSleepPreventer
  • 嗨@gabe.roze,来自MMPDeepSleepPreventer,他们说它可能会因为播放听不见的声音而被应用商店拒绝,你的应用在商店里吗??你必须重新提交你的应用程序吗?你有遇到什么问题吗?? iOs 7 或其他...我被卡住了,但不确定我是否可以使用 MMPDeepSleepPreventer :S
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多