所以我成功地创建了一个应用程序,在这种情况下,它是一个使用 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 文件做一些事情以允许音频背景播放。
所以问题是一些第 3 方软件的功能(在本例中为 LinPhone SIP 库的接收来电功能)在触发时会阻止我的应用程序在后台播放我的声音文件。
例如,这是一个测试用例:
- 启动我的应用程序,我听到铃声 wav 文件,这很好
- 我将应用程序置于后台模式,我仍然听到振铃的 wav 文件,这很好
- 我将应用程序重新聚焦,我仍然听到铃声,这很好
- 我触发了linphone接听电话功能,铃声还在继续,因为我在前台,这很好
- 我将应用程序置于后台模式,铃声停止,这不好
所以我怀疑 linphone 对 avaudioplayer/avaudiosession 做了一些事情,这样我就不能再在后台播放了。所以我的问题是,任何人都可以猜测 linphone 可能做了什么来阻止我的应用在后台播放声音,以及我如何解决这个问题?
补充说明
我什至尝试在应用程序处于后台时每秒实例化一个新的 avaudioplayer。但它无法覆盖 linphone 为使音频播放静音所做的任何事情。