Итак, у меня есть приложение, которое воспроизводит кучу песен, в то время как пользователь может пролистывать комиксы.Я использую AVAudioPlayer, и он настроен на воспроизведение песен в установленном порядке.Поэтому, когда одна песня заканчивается, следующая будет играть.Это работает безупречно, когда приложение открыто.Проблема возникает, когда приложение находится в фоновом режиме.Я настроил приложение для воспроизведения в фоновом режиме, и это прекрасно работает.Поэтому, когда пользователь нажимает на домашний экран, музыка продолжает играть.Проблема возникает, когда песня заканчивается, предполагается, что следующая песня будет воспроизводиться так же, как и при открытом приложении.Вместо этого ничего не происходит.Согласно моим заявлениям NSLog, правильные методы вызываются, но ничего не происходит.Вот мой код:
- (void)audioPlayerDidFinishPlaying: (AVAudioPlayer *)player successfully: (BOOL) flag {
NSLog(@"Song finished");
if ([songSelect isEqualToString: @"01icecapades"]) {
isPlay = @"yes";
songSelect = @"02sugarcube";
imageSelect = @"playbanner02";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}
else if ([songSelect isEqualToString: @"02sugarcube"]) {
isPlay = @"yes";
songSelect = @"03bullets";
imageSelect = @"playbanner03";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}
else if ([songSelect isEqualToString: @"03bullets"]) {
isPlay = @"yes";
songSelect = @"04satanama";
imageSelect = @"playbanner04";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}
else if ([songSelect isEqualToString: @"04satanama"]) {
isPlay = @"yes";
songSelect = @"05uglyjoke";
imageSelect = @"playbanner05";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}
else if ([songSelect isEqualToString: @"05uglyjoke"]) {
isPlay = @"yes";
songSelect = @"01icecapades";
imageSelect = @"playbanner01";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}}
Выше приведен код, который распознает, какая песня воспроизводится, и устанавливает правильную песню следующей.Затем он запускает другой метод, который настраивает проигрыватель.
- (void)triggerSong {
NSLog(@"triggerSong called");
NSString *path;
NSError *error;
// Path the audio file
path = [[NSBundle mainBundle] pathForResource:songSelect ofType:@"mp3"];
// If we can access the file...
if ([[NSFileManager defaultManager] fileExistsAtPath:path])
{
// Setup the player
player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
//player = [initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
[player setDelegate: self];
// Set the volume (range is 0 to 1)
player.volume = 1.0f;
[player prepareToPlay];
[player setNumberOfLoops:0];
[player play];
NSLog(@"player play");
[error release];
player.delegate = self;
// schedules an action every second for countdown
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateTimeLeft) userInfo:nil repeats:YES];
}}
Теперь я предполагаю, что это не лучший способ сделать это, но он прекрасно работает, когда приложение находится в состоянии переднего плана.Я просматривал документацию и не могу найти причину этой проблемы.Я надеялся, что кто-нибудь сможет увидеть ошибку в моем подходе.Как я уже говорил ранее, вызывается два NSLog в методе triggerSong, поэтому я не могу понять, почему не вызывается AVAudioPlayer (player).
Также у меня есть правильная настройка в моем info.plist, и у меня есть это в моем viewDidLoad:
//Make sure the system follows our playback status
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
Спасибо за любую информацию.Очень признателен.