iOS - 无法在后台播放声音

Posted

技术标签:

【中文标题】iOS - 无法在后台播放声音【英文标题】:iOS - Unable to play a sound in background 【发布时间】:2014-03-05 09:21:32 【问题描述】:

我目前正在尝试实现一个像警报系统这样的系统,以便在发生事件时提醒手机(在我的例子中是蓝牙事件)。即使手机处于静音和后台,我也希望出现此警报。

我创建了一个本地通知,但如果手机处于静音模式,我无法播放声音(这似乎很正常,因为我们将手机设为静音)。

所以我尝试自己管理声音,但在后台播放声音时遇到了困难。到目前为止,我在我的 plist 中实现了“应用程序播放音频或使用 AirPlay 流式传输音频/视频”键,并且我正在使用此代码。

AVAudiosession *audioSession = [AVAudioSession sharedInstance];
NSError *error = nil;
BOOL result = [audioSession setActive:YES error:&error];
if ( ! result && error) 
    NSLog(@"Error For AudioSession Activation: %@", error);


error = nil;
result = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
if ( ! result && error) 
    NSLog(@"Error For AudioSession Category: %@", error);


if (player == nil) 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bell" ofType:@"wav"];
    NSURL *url = [NSURL fileURLWithPath:path];
    NSError *err  = nil;
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&err];
    if(err)
    
        NSLog(@"Error Player == %@", err);
    
    else 
        NSLog(@"Play ready");
    


[player prepareToPlay];
[player setVolume:1.0];

if([player play])

    NSLog(@"YAY sound");

else 
    NSLog(@"Error sound");

即使在静音模式下,前台的声音也很好,但我在后台根本没有声音。有什么想法吗?

谢谢

编辑: 最后我得到了它与上面的代码一起工作。唯一缺少的一点是,当我在蓝牙事件中正确播放声音而不是我的函数调用它正在工作时,我试图在某种程度上播放声音似乎是不同的线程。

【问题讨论】:

你试过使用applicationDidEnterBackground:方法吗? 当应用程序进入后台执行一些长时间的操作(如保存)时调用此方法。在我的情况下,通知可能会在此之后很长时间(但我的应用程序可以执行一些操作,因为它是一个蓝牙事件) 【参考方案1】:

连续播放音频的应用程序(即使应用程序在后台运行时)可以通过在其 Info.plist 文件中包含 UIBackgroundModes 键(带有值音频)注册为后台音频应用程序。包含此键的应用必须在后台向用户播放有声内容。

Apple reference "Playing Background Audio"

Ensuring That Audio Continues When the Screen Locks

找到here

【讨论】:

我是否说过“我在我的 plist 中实现了“应用程序使用 AirPlay 播放音频或流式传输音频/视频”键”【参考方案2】:

我不确定您的问题是否是您没有正确配置音频会话输出。在我的应用程序中播放 .wav 时,我遇到了类似的问题。我只用耳机听。这个方法帮助了我:

- (void) configureAVAudioSession 
    //get your app's audioSession singleton object
    AVAudioSession *session = [AVAudioSession sharedInstance];

    //error handling
    BOOL success;
    NSError* error;

    //set the audioSession category.
    //Needs to be Record or PlayAndRecord to use audioRouteOverride:
    success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
                             error:&error];

    if (!success)  NSLog(@"AVAudioSession error setting category:%@",error);

    //set the audioSession override
    success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                                         error:&error];
    if (!success)  NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);

    //activate the audio session
    success = [session setActive:YES error:&error];
    if (!success) NSLog(@"AVAudioSession error activating: %@",error);
    else NSLog(@"audioSession active"); 

试试看!

【讨论】:

感谢您的帮助,我尝试添加 overrideOutputAudioPort 方法,但仍然无法正常工作...【参考方案3】:

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

用于在应用进入背景时启用声音。

1) 将必需的后台模式设置为应用播放音频

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

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

那么,你需要在 AppDelegate 中写这么多代码

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

它对我来说很好用。 :)

更多信息请参考Playing Audio in background mode和Audio Session Programming Guide

【讨论】:

以上是关于iOS - 无法在后台播放声音的主要内容,如果未能解决你的问题,请参考以下文章

iOS:开始从后台播放声音

音频在后台播放但没有声音 Cordova 3+ IOS

iOS 实现后台 播放音乐声音 AVAudioPlayer

iOS :AudioSession详解 Category选择 听筒扬声器切换

应用程序处于后台且静音模式开启时需要播放声音

是否可以在后台播放来自应用程序的声音