0

我有一个 AVAudioPlayer 播放音乐并在当前歌曲完成后自动转到下一首歌曲。这在应用程序打开时完美运行,但当应用程序未打开时,它只会播放下一首歌曲一次。在后台播放一首歌曲后,

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag

不会再被叫了。我有:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

在viewdidload中,但问题仍然存在,有谁知道会导致这种情况吗?

4

2 回答 2

0

您是否检查了 Supporting Files -> YourProject-Info.plist ->Required background modesApp plays audio该键中的项目?必须将其添加到 plist 才能在后台播放音乐。

于 2013-04-16T02:19:08.983 回答
0

编辑:这是另一种方式,更少的错误:这会每半秒检查一次当前进度(可能更准确的歌曲更改时间更短)。只需调用以下两个选择器之一:

- (void)applicationDidEnterBackground:(UIApplication *)application

或者以任何其他方法,这取决于你。

-(void ) sel1 {

[self performSelector:@selector(sel2) withObject:nil afterDelay:0.1];
NSLog(@"%f", ( _audioPlayer.duration -  _audioPlayer.currentTime) );


if (( _audioPlayer.duration - _audioPlayer.currentTime) < 0.5) {

    [self nextSong];
}

}

-(void) sel2 {

 [self performSelector:@selector(sel1) withObject:nil afterDelay:0.4];
}

----- //旧方式// -----

如果有人仍在尝试解决这个问题,我发现这是最好的解决方案。

- (void)applicationDidEnterBackground:(UIApplication *)application
{

float remaining = _audioPlayer.duration - _audioPlayer.currentTime;
[self performSelector:@selector(nextSong) withObject:nil afterDelay:remaining];

}

只需在应用程序进入后台后执行选择器。这将强制 AVAudioPlayer 在当前声音结束后立即更改歌曲。您必须小心,因为每次应用程序进入后台都会设置一个新的选择器,它们会堆叠起来(因此它会同时多次调用选择器)。我用一个计数器解决了这个问题,始终保持在 1。像这样:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
if (counter == 0) {
float remaining = _audioPlayer.duration - _audioPlayer.currentTime;
[self performSelector:@selector(nextSong) withObject:nil afterDelay:remaining];
counter ++;
}

}


-(void) nextSong {
counter = 0;

//Next Song Method

}
于 2014-05-04T15:01:45.787 回答