Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-无法在后台播放声音_Ios_Iphone_Audio_Avaudiosession - Fatal编程技术网

iOS-无法在后台播放声音

iOS-无法在后台播放声音,ios,iphone,audio,avaudiosession,Ios,Iphone,Audio,Avaudiosession,我目前正在尝试实现一个类似alarm one的系统,以便在事件发生时(在我的例子中是蓝牙事件)向手机发出警报。我希望即使手机处于静音和后台,也能发出此警报 我创建了一个本地通知,但如果手机处于静音模式,我无法播放声音(这似乎很正常,因为我们将手机置于静音模式) 所以我试着自己管理声音,我正在努力在后台播放声音。到目前为止,我在plist中实现了“应用程序使用AirPlay播放音频或流式音频/视频”键,我正在使用这段代码 AVAudioSession *audioSession = [AVAudi

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

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

所以我试着自己管理声音,我正在努力在后台播放声音。到目前为止,我在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");
}
声音在前景中效果很好,即使是在无声模式下,但我在背景中一点声音也没有。有什么想法吗

谢谢

编辑
最后我用上面的代码得到了它。唯一缺少的一点是,当我在bluetooth事件中正确播放声音而不是在函数调用中播放声音时,我尝试在另一个线程中播放声音。它正在工作。

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


找到

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

试试看

您需要在plist文件中进行几个更改

用于在应用程序进入后台时启用声音

1) 将所需背景模式设置为应用程序播放音频

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

NSError *setCategoryErr = nil;
NSError *activationErr  = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr];
然后,您需要在AppDelegate中编写这些代码

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

这对我来说很好。:)


有关更多信息,请参阅和

您是否尝试使用
ApplicationIdentinterBackground:
方法?当应用程序进入后台执行一些长时间操作(如保存)时,会调用此方法。在我的情况下,通知可能在这之后很久才发出(但我的应用程序可能会执行一些操作,因为它是一个蓝牙事件)我是否说过“我在我的plist中使用AirPlay”键实现“应用程序播放音频或流式音频/视频”感谢您的帮助,我尝试添加overrideOutputAudioPort方法,但仍然无法工作。。。