如何在静音模式下开始播放audio并locking在iOS 6中?

最终用户进程

  1. 打开应用
  2. 打开“静音模式”。
  3. 按'lockingbutton'
  4. 应用程序仍可以在数小时后开始播放声音,而不是在此期间播放任何audio。

这样做的应用程序

许多闹钟应用程序已经设法做到这一点,我不认为他们正在使用沉默的audio,以保持应用程序运行,因为他们不听起来,如果你真的退出应用程序与家庭。

  • 闹钟临
  • 我的时钟
  • 波形报警
  • 惊慌
  • 的iHome

…他们是否保持循环运行后被locking一些如何或它是一个通知(它无法播放声音沉默)启动应用程序备份播放audio或其他方法?

现行方法已实施

AVAudioPlayer使用:

AudioSessionInitialize(nil, nil, nil, nil); AudioSessionSetActive(YES); UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),&sessionCategory); 

并将Info.plist设置为:

所需的背景模式(UIBackGroundModes) – 应用程序播放audio(audio)

现在

即使在应用程序正在运行和屏幕上时,我也可以播放audio。 如果audio已经运行,那么应用程序可以通过主屏幕buttonclosures,audio将会运行。 但是如果应用程序没有播放audio,并且屏幕被locking,所有的线程都将被终止,audio也不会播放。 这些应用程序如何设法解决这个问题?

迄今为止发现的可能方法

答:使用“beginBackgroundTaskWithExpirationHandler:”以无限循环保持应用程序无限期运行。

优点:

  • 看起来你可以在很多情况下完成这项工作,甚至当用户按下回家时也是如此。

缺点:

  • 据我所知,这与苹果政策相违背。
  • 将会使用更多的资源

注释:

我几乎已经有了这个工作,可能会有一些调整。 这似乎不是所有这些其他警报正在做的事情,因为他们不会继续运行,如果你按家庭BTN。 这表明他们使用了一些方法,允许他们在locking状态下运行但不在BG中。 (这是我需要的)

另外,当你问你有多less时间跑步时,你会得到10分钟。 通过在那里放下一个无限循环,数字实际上会下降到0,然后进入底片数小时。(testing)我不知道这将在现实世界或应用程序接受方面如何performance。

B.使用无声audio循环来构成连续audio播放媒体中心

优点:

  • 在locking状态下工作,并在大多数情况下保持运行。

缺点:

  • 如果被其他媒体中心和其他场合中断,可能会失败。
  • 还可以去苹果的政策。

注释:

这可以在很多情况下工作,但是远远不够理想。 而自从我再次说,必须有另一种方法,没有logging。

迄今为止的结论

使用列出的APP进行testing表明,他们没有使用我刚刚描述的两种方法中的任何一种。 方法'A'似乎更接近,但是如果实现将不会performance这些应用程序的行为。

我用一个苹果开发人员票来获取更多的信息,我也会用这些方法发布任何新的发现。

谢谢

任何洞察力是赞赏,并为您的参与到目前为止。

你需要在plist文件中做一些修改。

即1)将所需的背景模式设置为应用程序播放audio

2)设置应用程序不在后台运行到YES。

  NSError *setCategoryErr = nil; NSError *activationErr = nil; [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr]; [[AVAudioSession sharedInstance] setActive:YES error:&activationErr]; 

然后,你需要在AppDelege中编写这么多的代码

现在,您可以轻松地在电话屏幕locking或后台运行audio。

如果你以前一直在你的应用程序中这样做:

  AudioSessionInitialize (NULL, NULL, NULL, NULL); AudioSessionSetActive(true); // Allow playback even if Ring/Silent switch is on mute UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),&sessionCategory); 

我有一个用户告诉我,audio不适用于应用程序(iOS5之前!)。 原来他们的戒指/无声开关被设置为“无声”。 所以我添加了这个代码,并导致“无声”设置被覆盖。 例如,如果您有音乐应用程序,并且想要继续播放音乐,则此function非常有用。

长期以来寻求的解决scheme可能是基于位置的理由。 基本上使用位置后台服务来定期更新您的应用程序,从而触发警报。 这可能是有道理的,包括一个像天气更新,这需要位置服务function的苹果。

我会在未来看看这一点。 如果你有时间来研究它,或者如果你有洞察力,请不要犹豫发布。

快乐狩猎。

只是一个检查,是你的代码缺less这一行:

 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

你有没有注册你的应用程序需要在后台使用audio?

从文档 :

答:我正在使用MPMoviePlayerController在iOS 4上播放iPhone上的纯audio电影和其他audio文件。如何确保我的audio在我的应用程序切换到背景或屏幕locking时继续播放?

首先,你必须声明你的应用程序支持后台执行。 应用程序通过在其Info.plist文件中包含UIBackgroundModes项来完成此操作。 该键标识您的应用程序支持哪些后台任务。 它的值是一个包含一个或多个string的数组。 指定string值audio以指示应用程序在后台播放可听内容给用户。

接下来,如果要确保在屏幕locking时电影audio仍在继续,则需要为audio会话分配适当的类别。 你不能依靠默认的audio会话,其类别(从iPhone OS 2.2开始)是AVAudioSessionCategorySoloAmbient(或等价地,kAudioSessionCategory_SoloAmbientSound)。

要在屏幕locking时或Ring / Silent开关处于“静音”位置时继续播放,请使用AVAudioSessionCategoryPlayback(或等效的kAudioSessionCategory_MediaPlayback)类别。 清单1演示了如何用AVAudioSessionCategoryPlayback类别初始化应用程序的audio会话。

查看SystemSoundID ; 尽pipe通过音量button和静音模式设置了音量,但audio将以“设置”>“声音”中的“振铃器和警报”滑块的音量播放。

我注意到这些应用程序对他们的要求非常清楚。 除非(1)用户在设置>通知中允许此应用程序的本地通知警报,并且(2)当用户locking屏幕时,应用程序是最前面的(例如,如果用户单击主页button退出应用程序, 然后locking屏幕)。

因此,它可能是一个本地通知和一个沉默的声音在后台播放的组合。 无声的声音意味着,当屏幕被locking,如果应用程序是最前面的,它不会被暂停。 本地通知因此被发送到应用程序本身,并且应用程序能够通过产生警报声响应。 或者,也许没有沉默的声音,你听到的声音只是附加到本地通知的自定义声音(但如果是这样的话,那么我不清楚为什么当屏幕locking时应用程序需要在最前面)。

另外,尽pipe我没有testing过这个,但是响应于马勒事件,iPhone上无声开关的行为可能在5.1中改变了(http://www.nytimes.com/2012/01/13/nyregion/ringing-最后,停止了,但是,去听音乐会,报警persists.html)。; 这可以解释为什么开发人员评论说,他们可以做到5.1。