我有一个AVAudioPlayer,它可以播放音乐,并在当前曲目播放完后自动转到下一首歌曲。 在打开应用程序时,此功能非常理想,但在未打开应用程序时,它将仅播放下一首歌曲。 在后台播放一首歌曲开始并结束后,

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

不会再打来电话。 我有:

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

在viewdidload中,但问题仍然存在,有人知道会导致什么吗?

===============>>#1 票数:0

您是否检查了Supporting Files-> YourProject-Info.plist-> Required background modes ,并且Item App plays audio在该Key中App plays audio 必须将其添加到plist才能在后台播放音乐。

===============>>#2 票数: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

}

  ask by user2272641 translate from so

未解决问题?本站智能推荐: