我已在应用的info.plist中为所需的背景模式设置应用播放音频,以保持mpmovieplayerviewcontroller在转到后台后不会被忽略。它做得很好。但是,Apple最近拒绝了我的应用更新,因为我设置了该属性。
然后我一直在寻找做同样工作但却失败的解决方案。为了处理它,我在视图控制器收到UIApplicationDidEnterBackgroundNotification
时保存当前播放时间-(void)willEnterBackground {
NSLog(@"willEnterBackground");
if (self.mp) {
playbackTime = self.mp.moviePlayer.currentPlaybackTime;
[self.mp dismissModalViewControllerAnimated:YES];
}
}
在收到UIApplicationWillEnterForegroundNotification之后设置currentPlayBackTime:
- (void)willEnterForeground {
NSLog(@"willEnterForeground");
if (!self.mp)
return;
if(self.mp.moviePlayer.playbackState == MPMoviePlaybackStateInterrupted || self.mp.moviePlayer.playbackState == MPMoviePlaybackStateStopped || self.mp.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
{
[self continuePlayback];
}
}
- (void)continuePlayback {
NSLog(@"%f", self.mp.moviePlayer.duration);
NSLog(@"%f", playbackTime);
[self.mp.moviePlayer stop];
self.mp = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[self.videos objectForKey:@"medium"]]] ;
[self.mp.moviePlayer setInitialPlaybackTime:playbackTime];
[self.mp.moviePlayer play];
[self presentModalViewController:self.mp animated:YES];
}
它有效,但有一些权衡: 当我重新启动它时,它丢失了流式视频部分。用户需要再次等待流式传输。
以下是我的问题:
如果我跳过该行,它将从视频的开头播放:
self.mp = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[self.videos objectForKey:@"medium"]]] ;
在continuePlayBack方法或我setCurrentPlayBackTime而不是setInitPlayBackTime。
答案 0 :(得分:3)
你发现的是完全正常的 - 很奇怪,但很正常。 MPMoviePlayerController
在新实例上使用时仅尊重initialPlaybackTime
。我确实建议你提交一个关于这个问题的错误报告,因为它已经知道了(iOS3),但没有修复。
没有办法保持缓冲状态,你起草的解决方案与我在许多应用程序中使用的解决方案几乎相同。
现在直接回答你的问题;
重新1)是和否。正如您自己发现的那样,Apple在使用UIBackgroundModes
时确实非常苛刻。即使他们明确建议使用它来实现不间断的AirPlay流式传输(视频和音频内容),但他们仍在拒绝应用程序,而他们所做的只是播放视频。我也认为Apple审核团队的一个史诗般的失败。你可能想试着反对他们的拒绝,引用他们自己的文档:
重要提示: UIBackgroundModes音频键将允许应用流式传输 使用AirPlay在后台播放音频或视频内容。
来自:http://developer.apple.com/library/ios/#qa/qa1668/_index.html
重新2)否(见引言答案文本)
让我也从另一方面解决这个问题......
如果您的问题实际上是在iOS5上,设备在通过AirPlay进行流式传输时进入睡眠模式。然后,实际上有一种可能的解决方法至少可行 - 即使它是令人讨厌的...... [/ p>
您可以注册MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification
并查看隐藏方法中的airPlayVideoActive
。一旦AirPlay处于活动状态,只需设置[UIApplication sharedApplication].idleTimerDisabled = YES;
即可防止空转。请记住,一旦AirPlay变为非活动状态,请执行相反操作。所有这些只应在iOS5上使用,因为iOS6修复了AirPlay处于活动状态时的空闲问题。