8

アプリのバックグラウンド オーディオを適切に有効にしました (plist 内)。バックグラウンドで SPPlaybackManager を使用して現在のトラックが完了した後に次のトラックを再生する (電話がロックされているかオフになっている場合) 機能しません。

現在のトラックが終了し、オーディオが停止すると、電話のロックが解除されてアプリが再びアクティブになるまで、アプリは次のトラックの再生を開始しません。

これを修正するにはどうすればよいですか? 次のトラックの再生を開始するために使用しているコードのスニペットを次に示します。現在のトラックが nil になるのを確認し、次のトラックの再生を開始します。ログは、次の現在のトラックがプレイバック マネージャー オブジェクトに設定されていることを示していますが、残念ながら何も表示されません。

- (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
4

2 に答える 2

8

解決策は非常にシンプルですが、実現するのに 1 年かかりました。私の以前の解決策は、前のトラックが終了する直前にバックグラウンド タスクを開始し、次のトラックが再生されるまで実行し続けることでした。これは非常にエラーが発生しやすいものでした。その代わり:

再生状態 (再生中または一時停止中) を追跡します。Playing に移行するたびに、バックグラウンド タスクを開始します。一時停止に移行しない限り、決して停止しないでください。トラック間でも Playing の状態を維持します。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

編集: ああ、やっとブログに書きました

于 2012-07-24T14:14:34.330 に答える