Итак, у меня есть приложение, которое воспроизводит кучу песен, в то время как пользователь может перелистывать комикс. Я использую 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];
}}
Теперь я предполагаю, что это не лучший способ сделать это, но он отлично работает, когда приложение находится в состоянии переднего плана. Я просматривал документацию, и я не могу найти причину этой проблемы. Я надеялся, что кто-то сможет увидеть ошибку в моем подходе. Как я уже говорил, два NSLogs в методе triggerSong вызываются, поэтому я не вижу, почему AVAudioPlayer (плеер) не вызывается.
Также у меня есть правильная настройка в моем info.plist, и у меня есть это в моем представленииDidLoad:
//Make sure the system follows our playback status
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
Спасибо за понимание. Очень признателен.