ios AVAudioPlayer在后台响起,直到其他东西关闭它?

时间:2013-08-29 18:54:55

标签: ios avaudioplayer avaudiosession

所以我成功创建了一个应用程序,在这种情况下,它是一个使用linphone sip库的VOIP应用程序。无论我的应用程序是在前台还是后台,我都在进行一些测试,我希望WAV文件始终可以播放。我能够使用以下代码成功实现此测试:

NSString * resourcePath = [NSString stringWithFormat:@"%@/myres/sounds/oldphone-mono.wav",[[NSBundle mainBundle] resourcePath]];



    ringer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:resourcePath] error:nil];

    [ringer setNumberOfLoops:100];



    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

    [[AVAudioSession sharedInstance] setActive:YES error:nil];



    [ringer setVolume:1.0];



    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

    AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);


        [ringer play];

我认为这是非常简单的代码,因为我从另一个堆栈溢出答案中复制了它。我还必须对我的plist文件做一些事情才能播放音频背景。

所以问题是来自某些第三方软件(在本例中为LinPhone SIP Library的接收来电功能)的功能在被触发时会阻止我的应用在后台播放我的声音文件。

举个例子,这是一个测试用例:

  • 启动我的应用程序,我听到响铃的wav文件,这很好
  • 我把应用程序置于后台模式,我仍然听到响铃的wav文件,这很好
  • 我把应用程序重新聚焦,我仍然听到铃声,那很好
  • 我触发了linphone接收呼叫功能,响铃仍然继续,因为我在前台,这很好
  • 我把应用程序置于后台模式,响铃停止,这不好

所以我怀疑linphone已经为avaudioplayer / avaudiosession做了一些事情,这样我就无法在后台播放了。所以我的问题是,任何人都可以猜测linphone可能做了什么来防止我的应用程序在后台播放声音,以及我如何解决这个问题?

其他说明

我甚至尝试在应用程序处于后台时每秒实例化一个新的avaudioplayer。但它无法覆盖linphone所做的任何事情,无法播放音频。

1 个答案:

答案 0 :(得分:1)

似乎Linphone搞砸了AVAudioSession类别选项。我不得不将类别选项重置为AVAudioSessionCategoryOptionMixWithOthers以解决问题,如下所示:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];