背景音频与cocalibspotify



我已经为我的应用程序(在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

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

记录你的演奏状态(演奏或暂停)。无论何时过渡到"播放",都要启动一个后台任务。永远不要停止它,除非你转换到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

编辑:哦,我终于写了博客。

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

相关内容

  • 没有找到相关文章

最新更新