首页 文章

iOS - 无法在后台播放声音

提问于
浏览
0

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

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

所以我试图自己管理声音,我正在努力在背景中播放声音 . 到目前为止,我在我的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");
}

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

谢谢

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

3 回答

  • 0

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

    Apple reference "Playing Background Audio"

    Ensuring That Audio Continues When the Screen Locks

    找到here

  • 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"); }
    

    试试看!

  • 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

相关问题