所以我成功创建了一个应用程序,在这种情况下,它是一个使用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的接收来电功能)的功能在被触发时会阻止我的应用在后台播放我的声音文件。
举个例子,这是一个测试用例:
所以我怀疑linphone已经为avaudioplayer / avaudiosession做了一些事情,这样我就无法在后台播放了。所以我的问题是,任何人都可以猜测linphone可能做了什么来防止我的应用程序在后台播放声音,以及我如何解决这个问题?
其他说明
我甚至尝试在应用程序处于后台时每秒实例化一个新的avaudioplayer。但它无法覆盖linphone所做的任何事情,无法播放音频。
答案 0 :(得分:1)
似乎Linphone搞砸了AVAudioSession类别选项。我不得不将类别选项重置为AVAudioSessionCategoryOptionMixWithOthers以解决问题,如下所示:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];