在静音模式下如何开始播放音频&锁定在iOS 6?

时间:2012-03-15 17:41:29

标签: iphone ios background avaudioplayer silent

最终用户流程

  1. 打开应用
  2. 启用“静音模式”。
  3. 按'锁定按钮'
  4. 应用程序仍然可以在数小时后播放声音,而不会在过渡期间播放任何音频。
  5. 执行此操作的应用

    许多闹钟应用都设法做到这一点&我不认为他们使用静音音频来保持应用程序运行,因为如果你真的退出家里的应用程序他们不会发出声音。

    • 闹钟专业版
    • 我的时钟
    • Wave Alarm
    • 惊见
    • 的iHome
    • ...

    ......他们是否在锁定某些通知(无法在静音中播放声音)后启动循环运行,启动应用程序备份以播放音频或其他方法?

    已实施的当前方法

    AVAudioPlayer使用:

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

    将Info.plist设置为:

    所需的背景模式(UIBackGroundModes) - 应用播放音频(音频)

    目前

    即使在应用程序运行和屏幕上的静音中,我也可以播放音频。如果音频已在运行,则可以使用主页按钮关闭应用程序并运行音频。但是,如果应用程序没有播放音频,并且屏幕被锁定,则所有线程都将被终止并且音频永远不会播放。这些应用程序如何解决这个问题?

    到目前为止找到的可能方法

    :一种。使用'beginBackgroundTaskWithExpirationHandler:'使用无限循环来保持应用程序无限期运行。

    优点:

    • 看起来你可以在很多情况下完成这项工作,即使用户按下了家。

    缺点:

    • 据我所知,这与苹果政策背道而驰。
    • 将使用更多资源

    注释:

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

    另外,当你问你剩下多少时间跑步时,你会得到大约10分钟。通过在那里放置一个无限循环,数字实际上会降低到0,然后进入负数几个小时。(测试)我不确定这将在现实世界中或在应用程序接受方面如何表现。

    B中。使用静音音频循环构成连续音频播放媒体中心

    优点:

    • 锁定时工作,并在大多数情况下继续运行。

    缺点:

    • 如果被其他媒体中心和其他一些场合打断,可能会失败。
    • 还可以再次申请苹果政策。

    注释:

    这可以在很多情况下起作用,但到目前为止还不理想。而且就像我再说一遍,必须有另一种没有记录的方法。

    迄今为止的结论

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

    我使用苹果开发者票来获取更多信息,我也会发布任何新的发现。

    谢谢

    我们非常感谢您的参与,并感谢您的参与。

8 个答案:

答案 0 :(得分:15)

您需要在plist文件中进行一些更改。

即。 1)将所需背景模式设置为App播放音频

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

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

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

现在,您可以在手机屏幕锁定或后台轻松运行音频。

答案 1 :(得分:5)

您以前是否曾在自己的应用中执行此操作:

    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);

我有一个用户告诉我音频不适用于应用程序(在iOS5之前!)。原来他们的铃声/静音开关设置为“静音”。所以我添加了这段代码,它会导致“静音”设置被覆盖。例如,如果您有音乐应用程序,并且希望音乐继续播放,则此功能非常有用。

答案 2 :(得分:2)

长期寻求的解决方案可能是基于位置的理由。基本上使用位置后台服务来证明定期更新您的应用程序,从而触发警报。这可以通过包含像天气更新这样需要位置服务的功能来证明苹果的合理性。

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

快乐狩猎。

答案 3 :(得分:1)

只需检查一下,您的代码是否缺少此行:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

答案 4 :(得分:1)

您是否已将应用注册为需要在后台使用音频?

From the docs

  

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

     

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

     

接下来,如果你想确保你的电影音频继续播放   屏幕锁定,您需要为音频指定适当的类别   会话。您不能依赖其类别的默认音频会话   (从iPhone OS 2.2开始)是AVAudioSessionCategorySoloAmbient(或   等价地,kAudioSessionCategory_SoloAmbientSound)。

     

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

答案 5 :(得分:0)

查看SystemSoundID;尽管音量按钮和静音模式设置了音量,但他们的音频以“设置>声音”中的“振铃和提醒”滑块的音量播放。

答案 6 :(得分:0)

我注意到这些应用程序非常清楚他们的要求。除非(1)用户允许此应用的本地通知提醒,否则它们将无法工作,请参阅设置>通知,以及(2)当用户锁定屏幕时,应用程序位于最前面(例如,如果用户单击“主页”按钮退出应用程序并且然后锁定屏幕,则它们将无法工作)。 / p>

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

此外,虽然我没有测试过这个,但iPhone上的静音开关的行为可能已经在5.1中发生变化以响应马勒事件(http://www.nytimes.com/2012/01/13/nyregion) /ringing-finally-stopped-but-concertgoers-alarm-persists.html)。这可以解释为什么开发人员在评论他们可以这样做直到5.1。

答案 7 :(得分:0)