AVPlayer replaceCurrentItemWithPlayerItem ne fonctionne pas sur iOS 4.3.3+

J'ai un lecteur audio que je suis en train de construire à l'aide de AVPlayer.

Actuellement, je garde le player exemple autour et quand j'ai besoin de swap de pistes (soit à partir d'une sélection manuelle ou la piste a atteint la fin) j'ai créer un nouveau AVPlayerItem et j'appelle replaceCurrentItemWithPlayerItem avec le nouvel élément.

Selon les docs, replaceCurrentItemWithPlayerItem est une opération asynchrone, donc j'ai également observer les currentItem chemin d'accès clé du joueur. Quand on le fait appelé, je dis à mes joueurs de jouer.

Voici le code correspondant:

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerItemStatusChangedContext];

if (!_player) {
    _player = [[AVPlayer alloc] initWithPlayerItem:playerItem]; 
    [_player addObserver:self forKeyPath:@"status"          options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerStatusChangedContext];
    [_player addObserver:self forKeyPath:@"currentItem"     options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerCurrentItemChangedContext];
} else {
    [_player replaceCurrentItemWithPlayerItem:playerItem];
}

Et ici est la valeur de la clé de l'observation de rappel:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == CHStreamingAudioPlayer_PlayerCurrentItemChangedContext) {
        NSLog(@"Player's current item changed! Change dictionary: %@", change);
        if (_player.currentItem) {
            [self play]; //<---- doesn't get called
        }
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

Sur iOS 4.3.3 (et iOS 5) mes clés à l'observation de la méthode est appelée, mais _player.currentItem est toujours nil. Sur 4.2.1 et 4.3.2 cette propriété contient la valeur réelle. Cette méthode n'est jamais appelé de nouveau. Donc, en substance, en remplacement semble toujours voués à l'échec.

Cela semble être un bug, mais peut-être que je suis en train de faire quelque chose de mal.

source d'informationauteur Ben Scheirman