Фоновое аудио с cocoalibspotify

Я правильно включил фоновое аудио для своего приложения (в списке). Воспроизведение следующей дорожки после завершения текущей записи с использованием SPPlaybackManager в фоновом режиме (когда телефон заблокирован / выключен) не работает.

Когда текущая дорожка заканчивается и звук останавливается, приложение не начнет воспроизводить следующую дорожку, пока телефон не разблокируется и мое приложение снова не станет активным.

Как это исправить? Вот фрагмент кода, который я использую, чтобы начать воспроизведение следующего трека. Я вижу, что текущий трек становится нулевым, а затем начинаю воспроизведение следующего трека. Журнал показывает, что следующая текущая дорожка устанавливается в объекте диспетчера воспроизведения, но, увы, она молчит.

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {



    if([keyPath isEqualToString:@"spotifyPlaybackManager.currentTrack"]){

        NSLog(@"%@ %@",keyPath,self.spotifyPlaybackManager.currentTrack);

        if(self.spotifyPlaybackManager.currentTrack==nil && self.mode == PlayerModeSpotify){

            NSLog(@"PLAY NEXT");
            [self.spotifyPlaybackManager playTrack:self.nextSPTrack callback:^(NSError *error){
                if(error) TKLog(@"Spotify Playback Error %@",error);
            }];
        }
        [[NSNotificationCenter defaultCenter] postNotificationName:PlayerNowPlayingItemDidChange object:self];
        return;
    }



    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

Приставка:

spotifyPlaybackManager.currentTrack (null)
PLAY NEXT
spotifyPlaybackManager.currentTrack <SPTrack: 0x60f8390>: Karaoke

2 ответа

Решение очень простое, но мне потребовался год, чтобы понять это. Моим старым решением было запустить фоновое задание незадолго до окончания предыдущего трека и продолжать его работу до следующего трека. Это было очень подвержено ошибкам. Вместо:

Отслеживайте свое игровое состояние (воспроизведение или пауза). Всякий раз, когда вы переходите в игру, запускайте фоновое задание. Никогда не останавливайте его, если вы не перейдете в режим паузы. Сохраняйте состояние воспроизведения даже между дорожками. Пока у вас есть режим фонового звука в вашем info.plist и воспроизводится звук, у вашего фонового задания будет бесконечное время ожидания.

Некоторый псевдокод:

@interface PlayController
@property BOOL playing;

- (void)playPlaylist:(SPPlaylist*)playlist startingAtRow:(int)row;
@end

@implementation PlayController
- (void)setPlaying:(BOOL)playing
{
    if(playing == _playing) return;
    _playing = playing;

    UIApplication *app = [UIApplication sharedApplication];
    if(playing)
        self.playbackBackgroundTask = [app beginBackgroundTaskWithExpirationHandler:^ {
            NSLog(@"Still playing music but background task expired! :(");
                    [app endBackgroundTask:self.playbackBackgroundTask];
                self.playbackBackgroundTask = UIBackgroundTaskInvalid;
            }];
    else if(!playing && self.playbackBackgroundTask != UIBackgroundTaskInvalid)
        [app endBackgroundTask:self.playbackBackgroundTask];
}
...
@end

Редактировать: Да, и я наконец-то написал об этом в блоге.

CocoaLibSpotify проделывает большую работу, чтобы начать воспроизведение трека, и, вероятно, будет создавать новые внутренние потоки в процессе. Я сомневаюсь, что это разрешено в звуковом стиле фона, поэтому вам, вероятно, потребуется запустить временную фоновую задачу для смены треков.

Другие вопросы по тегам