iOS - 无法在后台播放声音

时间:2014-03-05 09:21:33

标签: ios iphone audio avaudiosession

我目前正在尝试实施一个类似闹钟的系统,以便在事件发生时提醒手机(在我的情况下是蓝牙事件)。即使手机处于静音和后台,我也希望发出此警报。

我创建了一个本地通知,但是如果手机处于静音模式(由于我们将手机置于静音状态,这似乎是正常的),我无法播放声音。

所以我试图自己管理声音,我正在努力在背景中播放声音。到目前为止,我在我的plist中实现了“App播放音频或使用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");
}

即使在静音模式下,声音在前景中也很有效,但在背景中我根本没有声音。有什么想法吗?

由于

修改: 最后我使用上面的代码。唯一缺失的一点是,我试图播放声音有点似乎是一个不同的线程,当我在我的蓝牙事件中播放它而不是我的函数调用它正在工作。

3 个答案:

答案 0 :(得分:0)

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

Apple reference "Playing Background Audio"

Ensuring That Audio Continues When the Screen Locks

找到here

答案 1 :(得分:0)

我不确定您的问题是您是否未正确配置音频会话输出。在我的应用程序中播放.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"); }

尝试一下!

答案 2 :(得分:0)

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

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

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

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 modeAudio Session Programming Guide