iOS — AVAudioPlayer не переходит к следующей песне в фоновом режиме.

Итак, у меня есть приложение, которое воспроизводит кучу песен, пока пользователь может листать комикс. Я использую 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 (плеер).

Также у меня в инфо указана правильная настройка.plist, и у меня есть это в моем представленииDidLoad:

//Make sure the system follows our playback status
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];

Спасибо за любое понимание. Очень признателен.

10
задан Kevin Peters 12 March 2012 в 00:55
поделиться