背景音频与cocoalibspotify

dev*_*oss 8 spotify cocoalibspotify-2.0

我为我的应用程序正确启用了背景音频(在plist中).在当前完成后播放下一首曲目在后台使用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];
}
Run Code Online (Sandbox Code Playgroud)

安慰:

spotifyPlaybackManager.currentTrack (null)
PLAY NEXT
spotifyPlaybackManager.currentTrack <SPTrack: 0x60f8390>: Karaoke
Run Code Online (Sandbox Code Playgroud)

nev*_*vyn 8

解决方案非常简单,但我花了一年时间才意识到这一点.我的旧解决方案是在上一首曲目结束前启动后台任务,并保持运行直到下一首曲目正在播放.这非常容易出错.代替:

跟踪您的播放状态(播放或暂停).无论何时转换到播放,都要启动后台任务.永远不要停止它,除非你过渡到Paused.保持状态即使在曲目之间播放.只要您的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
Run Code Online (Sandbox Code Playgroud)

编辑:哦,我终于在博客上写了这篇文章.


iKe*_*dac -2

CocoaLibSpotify 做了很多工作来开始播放曲目,并且可能会在此过程中产生新的内部线程。我怀疑背景音频风格是否允许这样做,因此您可能需要启动临时后台任务来更改曲目。