2009-07-29 4 views
2

J'ai un long film que je vais mettre dans une application, et je voulais savoir quelle est la meilleure façon de remettre l'utilisateur au point où il s'était arrêté. Quelqu'un peut me diriger dans la bonne direction?Comment déterminez-vous l'emplacement actuel d'un utilisateur dans une instance MPMoviePlayer?

Donc, si l'utilisateur regarde le film, appuyez sur done, y a-t-il une notification de l'heure actuelle ou quelque chose que je peux stocker et charger à nouveau l'instance avec ce temps?

Merci!

Répondre

5

J'ai trouvé une technique OS 3.0 qui n'utilise pas de composants API privés.

Vous pouvez vous inscrire pour recevoir des notifications MPAVControllerTimeDidJumpNotification et récupérer le numéro NSAV MPAVControllerTimeParameter dans le dictionnaire userInfo de cette notification.

Par exemple, juste avant de commencer la lecture de registre pour recevoir les notifications:

#define MPAVControllerTimeDidJumpNotification @"MPAVControllerTimeDidJumpNotification" 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTimeChanged:) name:MPAVControllerTimeDidJumpNotification object:nil]; 

commencer ensuite la lecture du film. Ajouter une méthode qui sera appelée à chaque changement de temps que le film joue:

-(void)handleTimeChanged:(NSNotification *)notification 
{ 
    NSDictionary * userInfo = notification.userInfo; 
    int lastPositionInSeconds = [[userInfo valueForKey:@"MPAVControllerTimeParameter"] intValue]; 
    NSLog(@"Last time was %d", lastPositionInSeconds); 
} 

Et quand le film cesse de jouer (vous savez en écoutant les notifications MPMoviePlayerPlaybackDidFinishNotification) cesser d'écouter les notifications de MPAVControllerTimeDidJumpNotification.

+0

Jason, c'est génial. Extrêmement utile. –

+0

Donc, pour finir, vous pouvez stocker le lastPositionInSeconds, dans un db sql, et lorsque l'utilisateur revient à la vidéo, vous pouvez définir: moviePlayerController.initialPlaybackTime = lastPositionInSeconds; Et cela devrait fonctionner correctement. Merci encore! –

2

Ce doublons question ou est liée aux autres questions suivantes ici:

Pour réitérer les réponses à ces questions, il n'y a pas de courant API publique pour démarrer un film à une image spécifique ou un point dans le temps. Bien qu'il existe des API privées disponibles (-currentTime et -setCurrentTime), elles sont susceptibles d'être modifiées et votre application sera rejetée pendant le processus d'approbation.

+0

Je pense qu'il est injuste de dire "ils vont obtenir votre application rejetée". Si vous codez avec attention, vous pouvez tirer parti de ces choses de manière sûre, et votre application ne sera pas rejetée si elle a un bon repli (ou du moins ne plante pas). Il y a des tonnes d'applications dans le magasin avec des utilisations grises de l'API. –

+0

Pendant le processus de révision de l'application, Apple vérifie l'utilisation des API privées. S'il s'avère que vous utilisez une API privée, votre application sera rejetée.Bien qu'il y ait certainement des applications qui utilisent des API privées et échappent aux critiques, il ne devrait pas être recommandé de tirer parti des API privées, en particulier lorsqu'elles pourraient changer dans une future mise à jour du système d'exploitation et entraîner la rupture de votre application. Il ne serait pas avantageux pour une réponse proposée sur StackOverflow de recommander l'utilisation d'API privées. – shek

+0

Merci beaucoup pour votre aide, shek! C'est apprécié. –

0

Slava,

En fait, je regardais pour tous les événements se tiré par le système lors de la lecture du film et n'a pas vu tout ce qui pourrait aider. MPAVControllerTimeDidJumpNotification est déclenché périodiquement pendant la lecture, mais pas aussi souvent que chaque seconde. Il se peut qu'il soit viré pour chaque image clé, mais je n'en suis pas sûr.

+0

Jason, quand j'essayais cela, j'ai remarqué que lorsque l'utilisateur clique sur le bouton Terminé, ils sont à mi-chemin de la vidéo: 2009-07-31 10: 36: 04.297 VideoApp [2398: 207] La ​​dernière fois était 52 2009-07-31 10: 36: 11.933 VideoApp [2398: 207] La ​​dernière fois était 60 2009-07-31 10: 36: 11.952 VideoApp [2398: 207] Fin du film: La dernière fois était 0 2009-07-31 10: 36: 12.597 VideoApp [2398: 207] La ​​dernière fois était 0 Ils semblent toujours avoir 0 à la fin. Il n'y a donc pas de bon moyen de savoir si le film s'est réellement terminé ou si le bouton est terminé. Des idées sur la façon de résoudre ce problème? –

+0

Je n'avais pas correctement arrêté d'écouter quand je pensais l'avoir fait. Je vois que vous obtenez toujours une sortie finale avant l'appel de la notification. Merci encore! –

1
`NSDictionary * userInfo = notification.userInfo; 
    int lastPositionInSeconds = [[userInfo valueForKey:@"MPAVControllerTimeParameter"] intValue]; 
`// saving an NSInteger 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    [prefs setInteger:lastPositionInSeconds forKey:@"currentMovieTime"]; 

    // getting an NSInteger 
     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
     NSInteger myInt = [prefs integerForKey:@"currentMovieTime"]; // default is zero if nil 
     currentMovieTime = myInt; 
     self.streamMoviePlayer.initialPlaybackTime = currentMovieTime; 

Vous pouvez utiliser ceci pour définir/obtenir la variable et l'utiliser pour démarrer le film au bon moment. Cela fonctionnera même si l'utilisateur redémarre son téléphone ou redémarre l'application.