2009-07-29 7 views
2

Ich habe einen langen Film, den ich in eine App einlege, und ich wollte wissen, was der beste Weg ist, den Benutzer zurück zu dem Punkt zu bringen, den er aufgehört hat. Kann mir jemand in die richtige Richtung zeigen?Wie ermitteln Sie den aktuellen Standort eines Benutzers in einer MPMoviePlayer-Instanz?

Also, wenn der Benutzer den Film sieht, done drücken, gibt es eine Benachrichtigung über die aktuelle Zeit oder etwas, das ich speichern und die Instanz wieder mit dieser Zeit laden kann?

Danke!

Antwort

5

Ich habe eine OS 3.0-Technik gefunden, die keine privaten API-Komponenten verwendet.

Sie können sich registrieren, um MPAVControllerTimeDidJumpNotification-Benachrichtigungen zu erhalten, und die MPAVControllerTimeParameter NSNumber aus dem userInfo Dictionary dieser Benachrichtigung abrufen.

Zum Beispiel, kurz bevor Sie die Wiedergabe starten, um die Register-Benachrichtigung zu erhalten:

#define MPAVControllerTimeDidJumpNotification @"MPAVControllerTimeDidJumpNotification" 

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

dann den Film abgespielt. Fügen Sie eine Methode, die für jede Zeitänderung aufgerufen wird, als der Film abgespielt wird:

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

Und wenn der Film zu spielen aufhört (Sie wissen, dass dies für MPMoviePlayerPlaybackDidFinishNotification Mitteilungen hören) stoppen für die MPAVControllerTimeDidJumpNotification Meldungen hören.

+0

Jason, das ist großartig. Extrem hilfreich. –

+0

Zum Schluss könnten Sie die lastPositionInSeconds in einer sql db speichern, und wenn der Benutzer zum Video zurückkehrt, können Sie Folgendes festlegen: moviePlayerController.initialPlaybackTime = lastPositionInSeconds; Und das sollte gut funktionieren. Danke noch einmal! –

2

Diese Frage Duplikate oder ist mit folgenden anderen Fragen hier:

Um die Antworten von diesen Fragen zu wiederholen, gibt es keine aktuelle öffentliche API, um einen Film zu einem bestimmten Frame oder Zeitpunkt zu starten. Es sind zwar private APIs verfügbar (-currentTime und -setCurrentTime), sie können jedoch geändert werden und Ihre App wird während des Genehmigungsprozesses abgelehnt.

+0

Ich denke, es ist unfair zu sagen "sie werden Ihre App abgelehnt". Wenn Sie sorgfältig programmieren, können Sie diese Dinge auf sichere Weise nutzen und Ihre App wird nicht zurückgewiesen, wenn sie einen ordentlichen Fallback hat (oder zumindest nicht abstürzt). Es gibt Tonnen von Apps im Laden mit grauen Anwendungen der API. –

+0

Während des App-Überprüfungsverfahrens überprüft Apple die Verwendung privater APIs. Wenn Sie eine private API verwenden, wird Ihre App abgelehnt.Zwar gibt es sicherlich Apps, die private APIs verwenden und durch die Bewertungsrisse rutschen, es sollte jedoch nicht empfohlen werden, private APIs zu nutzen, insbesondere wenn sie sich in einem zukünftigen Betriebssystemupdate ändern und zum Bruch Ihrer App führen könnten. Es wäre für eine vorgeschlagene Antwort auf StackOverflow nicht vorteilhaft, die Verwendung privater APIs zu empfehlen. – shek

+0

Vielen Dank für Ihre Hilfe, Shek! Es ist geschätzt. –

0

Slava,

ich eigentlich für alle Ereignisse beobachtet zu werden durch das System während der Wiedergabe von Filmen gefeuert und nichts anderes sehen, die helfen können. Diese MPAVControllerTimeDidJumpNotification wird während der Wiedergabe regelmäßig ausgelöst, aber nicht so oft wie etwa jede Sekunde. Es kann für jeden Keyframe gefeuert werden, aber ich bin mir nicht sicher.

+0

Jason, als ich dies versuchte, bemerkte ich, dass, wenn der Benutzer die Fertig-Taste drückte, sagen sie, dass sie die Hälfte des Videos sind: 2009-07-31 10: 36: 04.297 VideoApp [2398: 207] Das letzte Mal war 52 2009-07-31 10: 36: 11.933 VideoApp [2398: 207] Das letzte Mal war 60 2009-07-31 10: 36: 11.952 VideoApp [2398: 207] Film beendet: Das letzte Mal war 0 2009-07-31 10: 36: 12.597 VideoApp [2398: 207] Das letzte Mal war 0 Sie scheinen am Ende immer 0 zu bekommen. Es gibt also keinen guten Weg zu sagen, ob der Film tatsächlich zu Ende ist oder ob er den Done-Button gedrückt hat. Irgendwelche Ideen, wie das zu beheben ist? –

+0

Ich hatte nicht richtig aufgehört zuzuhören, als ich dachte ich hätte. Ich sehe, dass Sie immer noch eine letzte Ausgabe erhalten, bevor die fertig gestellte Benachrichtigung aufgerufen wird. Danke noch einmal! –

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; 

Sie können damit die Variable einstellen/abrufen und damit den Film zur richtigen Zeit starten. Dies funktioniert auch dann, wenn der Benutzer das Telefon neu startet oder die Anwendung neu startet.