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