带有CoCoalLibSpotify的背景音频

带有CoCoalLibSpotify的背景音频,spotify,cocoalibspotify-2.0,Spotify,Cocoalibspotify 2.0,我已经为我的应用程序正确启用了背景音频(在plist中)。在后台使用SPPlaybackManager(当手机锁定/关闭时)播放当前曲目完成后的下一首曲目不起作用 当当前曲目结束且音频停止时,应用程序将不会开始播放下一首曲目,直到手机解锁且我的应用程序再次激活 我该如何解决这个问题?下面是我用来开始播放下一首曲目的代码片段。我观察到当前曲目变为零,然后开始播放下一首曲目。日志显示正在播放管理器对象中设置下一个当前曲目,但它是无声的 - (void) observeValueForKeyPath:

我已经为我的应用程序正确启用了背景音频(在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];
}
控制台:

spotifyPlaybackManager.currentTrack (null)
PLAY NEXT
spotifyPlaybackManager.currentTrack <SPTrack: 0x60f8390>: Karaoke
spotifyPlaybackManager.currentTrack(空)
下一场比赛
spotifyPlaybackManager.currentTrack:卡拉OK

CoCoAlibsSpotify在开始播放曲目时做了大量工作,并可能在此过程中产生新的内部线程。我怀疑这在音频风格的背景中是允许的,所以你可能需要开始一个临时的背景任务来改变曲目。

解决方案非常简单,但我花了一年时间才实现。我以前的解决方案是在前一首曲目结束前启动一个后台任务,并一直运行到下一首曲目播放。这很容易出错。相反:

跟踪您的播放状态(播放或暂停)。每当你转换到游戏,开始一个后台任务。永远不要停止,除非你过渡到暂停状态。保持状态为在曲目之间播放。只要您的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

编辑:哦,还有我。

我刚刚尝试在调用“self.spotifyPlaybackManager playTrack:…”之前直接将“beginBackgroundTaskWithExpirationHandler”放进去,一旦尝试创建新任务,代码就会暂停运行。还有其他建议吗?我的音频应用程序(GroovePond)在播放背景音频时会执行很多后台任务,比如接受新客户端和更新现有客户端的状态,苹果似乎对此没有任何问题。我认为,因为这些任务与音频播放直接相关,所以它们是被允许的。工作起来很有魅力。你是真正的救世主!啊,啪。毕竟没用。这似乎一开始不是我的问题。谢谢你的帖子。但是
endBackgroundTask:
是否停止我们刚刚启动的后台任务,因此应用程序无法再次运行任何其他代码?i、 e.调用
endBackgroundTask:
后,应用程序将无法再次调用
setPlaying:
。Drei:endBackgroundTask位于else子句中,因此只有当您停止播放时才会调用它。之后,用户再次激活应用程序之前,您自然无法开始播放(因为只有用户才能开始播放)。请记住,此方法适用于用户是否在语义上播放,而不是您当前是否正在接收流式音频,或者您是否在曲目之间。