在应用程序进入后台后启动时,无法启动 AVQueuePlayer
开始播放声音队列 .
基本问题是: how to start sound from newly created AVQueuePlayer instance from background?
对于类似导航的应用程序,需要在时机成熟时播放具有适当方向的组合声音 . 大多数时候应用程序在后台工作......
详情如下......
当我从活动应用程序启动它时播放就好了,即使在应用程序转到后台后也能完成播放声音 .
What I did so far:
在 AppDelegate
里面 didFinishLaunchingWithOptions
我补充说:
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setDelegate:self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
// Change the default output audio route
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);
应用程序启动后,我单击主页按钮,以便应用程序进入后台 .
当时间到了,这个代码执行了(应用程序仍在后台,但请注意,我已启用 Audio and AirPlay background mode ):
-(void)playTrainingFinishedSound
{
NSMutableArray *queue = [NSMutableArray array];
[queue addObject:[AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"alertkoniectreningu" withExtension:@"m4a"]]];
[self initializeAudioPlayerWithQueue:queue];
[self.appDelegate.audioPlayer play];
}
-(void)initializeAudioPlayerWithQueue:(NSArray *)queue
{
self.appDelegate.audioPlayer = [[AVQueuePlayer alloc] initWithItems:queue];
self.appDelegate.audioPlayer.actionAtItemEnd = AVPlayerActionAtItemEndAdvance;
}
不幸的是,这个代码没有发出任何声音,与应用程序处于前台时的情况相反 .
2 回答
天哪,AppDelegate中只丢失了一行
didFinishLaunchingWithOptions
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
所以现在看起来像:
AVPlayer失败的原因是因为当应用程序在后台时您无法创建/初始化音频单元,这正是AVPlayer尝试在幕后进行的操作 . 此规则的例外当然是音频播放应用程序,它们可以通过操作系统内置的“播放”按钮启动/恢复,而它们在后台 . 因此,订阅远程控制事件的应用程序具有在后台启动音频单元的能力,这就是订阅这些事件似乎解决问题的原因 .
目前尚不清楚Apple是否可以通过这种方式使用API功能 .