47

最终用户流程

  1. 打开应用
  2. 打开“静音模式”。
  3. 按“锁定按钮”
  4. 几个小时后,应用程序仍然可以开始播放声音,在此期间不播放任何音频。

执行此操作的应用程序

许多警报应用程序都设法做到了这一点,我认为他们没有使用静音音频来保持应用程序运行,因为如果您实际上在家中退出应用程序,它们不会发出声音。

  • 闹钟专业版
  • 我的时钟
  • 波浪警报
  • 惊慌
  • 爱家
  • ...

...他们是在被锁定后保持循环运行还是通知(无法静音播放声音)启动应用程序以播放音频或其他方法?

当前实施的方法

AVAudioPlayer 使用:

AudioSessionInitialize(nil, nil, nil, nil);
AudioSessionSetActive(YES);

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),&sessionCategory);

并将 Info.plist 设置为:

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

现在

当应用程序正在运行并在屏幕上时,我什至可以在静音状态下播放音频。如果音频已经在运行,则可以使用主页按钮关闭应用程序,然后音频将运行。但是,如果应用程序没有播放音频,并且屏幕被锁定,则所有线程都将被终止,并且永远不会播放音频。这些应用程序如何设法解决这个问题?

迄今为止发现的可能方法

A. 使用带有无限循环的“beginBackgroundTaskWithExpirationHandler:”来保持应用程序无限期运行。

优点:

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

缺点:

  • 据我所知,这违反了苹果的政策。
  • 将使用更多资源

评论:

我几乎已经完成了这项工作,并且可能会进行一些调整。这似乎不是所有这些其他警报所做的事情,因为如果您按 Home BTN,它们不会继续运行。这表明他们使用某种方法允许他们在锁定但不在 BG 中时运行。(这是我需要的)

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

B. 使用静音音频循环来充当连续音频播放媒体中心

优点:

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

缺点:

  • 如果被另一个媒体中心和其他一些场合打断,可能会失败。
  • 也可以反对苹果政策。

评论:

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

迄今为止的结论

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

我使用苹果开发者票来获取更多信息,我也会通过这些方式发布任何新发现。

谢谢你

感谢您的任何见解,并感谢您迄今为止的参与。

4

8 回答 8

15

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

即 1) 将所需的后台模式设置为 App 播放音频

2) 将应用程序不在后台运行设置为是。

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

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

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

于 2013-02-01T07:13:15.127 回答
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 之前!)。原来他们的铃声/静音开关设置为“静音”。所以我添加了这段代码,它会导致“静音”设置被覆盖。例如,如果您有一个音乐应用程序,并且您希望音乐继续播放,这将非常有用。

于 2012-03-15T20:13:29.947 回答
2

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

将来我会对此进行一些研究。请如果您现在有时间研究它,或者如果您有洞察力,请不要犹豫发布。

狩猎愉快。

于 2012-11-26T04:57:47.193 回答
1

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

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
于 2012-03-16T22:04:25.127 回答
1

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

从文档

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

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

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

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

于 2012-03-26T00:25:54.540 回答
0

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

于 2012-03-15T19:51:11.407 回答
0

我注意到这些应用程序非常清楚它们的要求。除非 (1) 用户在设置 > 通知中允许此应用程序的本地通知警报,并且 (2) 当用户锁定屏幕时应用程序位于最前面(例如,如果用户单击它们将无法工作,否则它们将无法工作) Home 按钮退出应用程序,然后锁定屏幕)。

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

此外,虽然我没有对此进行测试,但 iPhone 上静音开关的行为可能在 5.1 中因马勒事件而发生了变化(http://www.nytimes.com/2012/01/13/nyregion/ringing-最终停止但音乐会观众警报persists.html)。这可以解释为什么开发人员评论说他们可以在 5.1 之前做到这一点。

于 2012-03-27T03:04:47.093 回答