MPNowPlayingInfoCenter ne réagit pas correctement lors de l'arrêt de la lecture

j'essaie d'obtenir MPNowPlayingInfoCenter pour travailler correctement lors de la pause de lecture. (J'ai une application de musique en streaming qui utilise AVPlayer pour la lecture, et je joue de nouveau dans mon Apple TV sur Airplay.) Tout sauf la pause semble se refléter correctement dans L'interface utilisateur D'Apple TV. Je l'initialise comme ceci:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtist: artist
};
center.nowPlayingInfo = songInfo;

depuis que je suis en streaming, je n'ai pas d'informations sur la durée au démarrage de la lecture. Quand je reçois le signal "prêt" du flux, je mets à jour le durée qui apparaît correctement sur mon Apple TV:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];
[playingInfo setObject:[NSNumber numberWithFloat:length] forKey:MPMediaItemPropertyPlaybackDuration];
center.nowPlayingInfo = playingInfo;

je peux aussi chercher avec cette technique quand l'utilisateur cherche la piste:

[playingInfo setObject:[NSNumber numberWithFloat:length * targetProgress] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];

la seule chose que je ne peux pas comprendre est, comment mettre en pause la tête de lecture sur mon Apple TV. Lorsque l'utilisateur tape pause dans mon UI, j'essaie de faire quelque chose comme:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];        
[playingInfo setObject:[NSNumber numberWithFloat:0.0f] forKey:MPNowPlayingInfoPropertyPlaybackRate];            
center.nowPlayingInfo = playingInfo;

au lieu de s'arrêter, il cherche la tête de lecture à zéro et continue de l'avancer.

Comment faire pour que la tête de lecture s'arrête correctement dans mon interface utilisateur Apple TV?

42
demandé sur Jaanus 2012-08-01 07:58:23

4 réponses

j'ai la solution! Définir seulement le MPMediaItemPropertyPlaybackDuration

1-Lorsque vous démarrez la piste, définissez la propriété avec la durée totale de la piste:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtist: artist
    MPMediaItemPropertyPlaybackDuration : [NSNumber numberWithFloat:length]
};
center.nowPlayingInfo = songInfo;

2-lorsque vous mettez la piste en pause... de ne rien faire.

3-lorsque vous jouez la piste, définissez la propriété avec le currentTrackTime:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo];        
[playingInfo setObject:[NSNumber numberWithFloat:player.currentTrackTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];            
center.nowPlayingInfo = playingInfo;
13
répondu Damien Romito 2014-09-03 16:41:57

voici ce que vous cherchez, ce très bon travail ajouter ceci à votre classe:

- (void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {

    if (receivedEvent.type == UIEventTypeRemoteControl) {

        switch (receivedEvent.subtype) {

            case UIEventSubtypeRemoteControlTogglePlayPause:[self playPause:nil];

                break;

            default: break;
        }
    }
}

vous pouvez ajouter des fonctions vers l'avant ou vers l'arrière avec l'ajout d'un autre code de cas comme celui-ci:

case UIEventSubtypeRemoteControlBeginSeekingBackward:[self yourBackward:nil];
                break;

et pour appeler play pause vous devez créer une action comme celle-ci:

- (IBAction)playPause:(id)sender {

    if (yourPlayer.rate == 1.0){

        [yourPlayer pause];
    } else if (yourPlayer.rate == 0.0) {

        [yourPlayer play];
    }
}

Important: chaque cas que vous ajoutez besoin de L'IBAction

Espère que cela vous aider à

3
répondu BlackSheep 2013-04-30 13:57:16
MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
NSDictionary *songInfo = @{
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtist: artist
};

l'appel comme

center setnowPlayingInfo = songInfo;
-2
répondu abymathew 2013-10-01 11:15:51

j'ai essayé ma suggestion à partir des commentaires (il y a environ un mois), et ils ont travaillé pour moi:

[playingInfo setObject: [NSNumber numberWithFloat:0.000001f]
                forKey: MPNowPlayingInfoPropertyPlaybackRate];

(Qui est, déplacez la tête de lecture verrrrry lentement.), J'ai ajouté un NSTimer pour réinitialiser le MPNowPlayingInfoPropertyElapsedPlaybackTime périodiquement pendant qu'il est en pause.

pour toute personne N'ayant pas utilisé NSTimer auparavant, veuillez voir Comment dois-je utiliser NSTimer? .

-3
répondu Aaron Brager 2017-05-23 12:01:05