MPMoviePlayerViewController Hintergrundabkommen. Wie kann ich weiterspielen, nachdem ich vom Hintergrund in den Vordergrund zurückgekehrt bin?
Ich arbeite an einer Anwendung für Video-Streaming. Es ist mit ARC für iOS5 gebaut. Zum Anzeigen der Ansicht benutze ichMPMoviePlayerViewController diesen Weg:
.h
@interface EpisodesTableViewController : UITableViewController<EpisodeUrlResolverDelegate> {
NSTimeInterval playbackTime;
EpisodeUrlResolver *episodeUrlResolver;
}
@property (strong, nonatomic) MPMoviePlayerViewController *player;
@end
.m
@implementation EpisodesTableViewController
@synthesize episodes, player;
- (void)viewDidLoad
{
[super viewDidLoad];
episodeUrlResolver = [[Soap4MeEpisodeUrlResolver alloc] init];
[episodeUrlResolver setDelegate:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterForeground) name:@"WillEnterForeground" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterBackground) name:@"WillEnterBackground" object:nil];
}
- (void)viewDidUnload
{
episodeUrlResolver = nil;
player = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"WillEnterForeground" object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"WillEnterBackground" object:nil];
[super viewDidUnload];
}
- (void)url:(NSURL *)url WasResolvedForEpisode:(Episode *)episode {
player = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
player.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
player.moviePlayer.allowsAirPlay = YES;
[self presentModalViewController:player animated:YES];
}
- (void)willEnterBackground {
if (player) {
playbackTime = player.moviePlayer.currentPlaybackTime;
}
}
- (void)willEnterForeground {
if (!player)
return;
if(player.moviePlayer.playbackState == MPMoviePlaybackStateInterrupted || player.moviePlayer.playbackState == MPMoviePlaybackStateStopped || player.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
{
[self continuePlayback];
}
}
- (void)continuePlayback {
[self presentModalViewController:player animated:YES];
[player.moviePlayer setInitialPlaybackTime:playbackTime];
NSLog(@"%f", player.moviePlayer.initialPlaybackTime);
[player.moviePlayer play];
}
Ein paar Worte zu präsentiertem Code: Wenn die URL für das Video aufgelöst ist, erstelle ich dieMPMoviePlayerViewController Objekt für die Videowiedergabe. Die Wiedergabe wird gestartet. Dann, wenn App Hintergrund mit Home-Taste gehtMPMoviePlayerViewController pausiert automatisch die Wiedergabe und verschwindet vom Bildschirm (seltsames Verhalten, wie für mich). Das ist der Grund, warum ich die Wiedergabezeit sparen muss, wenn die App im Hintergrund läuft und die vorhandene zeigtMPMoviePlayerViewController Wieder mit wiederhergestellter Wiedergabezeit, wenn die App wieder im Vordergrund ist. Es funktioniert einwandfrei, wenn der Benutzer die Home-Taste drückt und dann zur Anwendung zurückkehrt.
Es funktioniert jedoch nicht, wenn der Benutzer das Gerät sperrt.WillEnterBackground Benachrichtigung wird ausgelöst, wennapplicationWillEnterForeground wird aufgerufen, für Sperrereignisse wird es auch aufgerufen. Für den Fall, dass der Benutzer das Gerät sperrt, wurde MPMoviePlayerViewController nicht ordnungsgemäß entlassen, wie wenn der Benutzer die Home-Taste drückt. Es ist vor dem Bildschirm verborgen, ruft aber den Code auf
[self presentModalViewController:player animated:YES];
wirft die Ausnahme
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <EpisodesTableViewController: 0x91b3950>.'
Ich habe versucht, den Code zu ändern, um den Controller zu schließen:
- (void)willEnterForeground {
if (!player)
return;
if(player.moviePlayer.playbackState == MPMoviePlaybackStateInterrupted || player.moviePlayer.playbackState == MPMoviePlaybackStateStopped || player.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
{
if (self.presentedViewController) {
[self dismissViewControllerAnimated:YES completion:^{
[self continuePlayback];
}];
}
else {
[self continuePlayback];
}
}
}
Jetzt wird die Ausnahme nicht ausgelöst, sondern eine Warnung angezeigt
wait_fences: failed to receive reply: 10004003
EbenfallsFertigstellung Block wird nie aufgerufen.
Wie man den Hintergrund / Vordergrund richtig auflöst, spielt man mit dem modal angezeigten MPMoviePlayerViewController weiter? Danke für die Antworten.