1

我在我的应用程序的 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];
}

它可以工作,但需要权衡:当我重新启动它时,它丢失了流式视频部分。用户需要再次等待流式传输。

我的问题来了:

  1. 有没有办法在应用程序处于后台时继续流式传输 Youtube 的视频?
  2. 或者如何保持流式传输的部分?

如果我跳过该行,它将从视频的开头播放:

self.mp = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[self.videos objectForKey:@"medium"]]] ;

在 continuePlayBack 方法或我 setCurrentPlayBackTime 而不是 setInitPlayBackTime。

4

1 回答 1

3

你在那里发现的东西是完全正常的——很奇怪,但很正常。仅在新实例上使用MPMoviePlayerController时才尊重。initialPlaybackTime我确实敦促您提交关于该问题的错误报告,因为它自古以来就已知(iOS3)但未修复。

没有办法保持缓冲区状态,您起草的解决方案与我在许多应用程序中使用的几乎相同。


现在直接回答你的问题;

重新 1) 是和否。正如您自己发现的那样,Apple 确实对UIBackgroundModes使用非常苛刻。尽管他们明确建议使用它来实现不间断的 AirPlay 流(视频和音频内容),但当他们所做的只是播放视频时,他们仍然拒绝应用程序。我还认为苹果审查团队方面的一次史诗般的失败。您可能想尝试与他们的拒绝作斗争,引用他们自己的文档:

重要提示: UIBackgroundModes 音频键将允许应用使用 AirPlay 在后台流式传输音频或视频内容。

来自:http: //developer.apple.com/library/ios/#qa/qa1668/_index.html

re 2) 否(见介绍性答案文本)


让我也从不同的角度来解决这个问题......

如果您的问题实际上是在 iOS5 上设备在通过 AirPlay 流式传输时进入睡眠模式。然后,实际上有一种可能的解决方法至少可以工作 - 即使它非常讨厌......

您可以在 hooked 方法中注册MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification并检查 。airPlayVideoActive一旦 AirPlay 处于活动状态,只需通过设置[UIApplication sharedApplication].idleTimerDisabled = YES;记住在 AirPlay 变为非活动状态后执行相反的操作来防止空闲。所有这些都应该只在 iOS5 上需要,因为 iOS6 修复了 AirPlay 处于活动状态时的空闲问题。

于 2013-03-14T20:53:35.777 回答