MPMoviePlayerViewController работает в фоновом режиме и с помощью пульта дистанционного управления - PullRequest
0 голосов
/ 01 августа 2011

В настоящее время я работаю на iOS 4.3.5 и пытаюсь заставить мой MPMoviePlayerViewController продолжить играть после ввода фона.

Я реализовал все как описано на

http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

и

http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/RemoteControl/RemoteControl.html

Я также установил UIBackgroundMode на audio.

Мой пользовательский класс MPMoviePlayerViewController вызывается следующим образом из TabBarApplication:

    NSURL *streamUrl = [NSURL URLWithString:STREAM_URL];

self.playerViewController = [[CustomMoviePlayerViewController alloc] initWithContentURL:streamUrl];

// Register for the playback finished notification
[[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(myMovieFinishedCallback:)
                                            name:MPMoviePlayerPlaybackDidFinishNotification
                                            object:self.playerViewController.moviePlayer];
// Present
[self presentMoviePlayerViewControllerAnimated:self.playerViewController];

// Play the movie!
self.playerViewController.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
[self.playerViewController.moviePlayer prepareToPlay];
[self.playerViewController.moviePlayer play];

Внутри моего CustomMovePlayerController выглядит следующим образом:

-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}

-(void)viewWillAppear:(BOOL)animated {
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}

-(void)viewWillDisappear:(BOOL)animated {
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];

[self resignFirstResponder];
[super viewWillDisappear:animated];
}

-(BOOL)canBecomeFirstResponder {
return YES;
}

-(void)remoteControlReceivedWithEvent:(UIEvent *)event {
[super remoteControlReceivedWithEvent:event];
NSLog(@"remoteControlReceived");
NSLog(@"%d", [[AVAudioSession sharedInstance] isActive]);
if (event.type == UIEventTypeRemoteControl) {
    switch (event.subtype) {
        case UIEventSubtypeRemoteControlPlay:
            [self.moviePlayer play];
            break;

        case UIEventSubtypeRemoteControlPause:
            [self.moviePlayer pause];
            break;          
        default:
            break;
    }
}
}

Основная проблема с моим MPMoviePlayerViewController состоит в том, что он не отвечает на сообщение remoteControlReceivedWithEvent, почему? Я подклассифицировать не ту вещь? Мое приложение на основе вкладок не позволяет мне сделать это?

Последний, но не наименее - applicationDidFinishLaunchingWithOptions содержит следующее:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];

Я просто не могу понять, чего не хватает ... всяческая помощь очень ценится!

1 Ответ

1 голос
/ 30 декабря 2011

Я думаю, что могу ответить на оба вопроса:)

Фоновая проблема:

Какой формат файла вы пытаетесь воспроизвести? Мое приложение какое-то время использовало MPMoviePlayerViewController для фонового звука, но недавно было сообщение о том, что оно больше не воспроизводится в фоновом режиме.

Оказывается, это были файлы AAC; это подкасты с главами и обложками на главы ... В iOS 5 добавлена ​​улучшенная поддержка для них, но это должно заставить MPMoviePlayerViewController думать, что он воспроизводит видео. Фоновое видео было отключено вокруг iOS 4.3, из того, что я могу найти.

Попробуйте это с простым файлом MP3, который все еще работает для меня. Я собираюсь зарегистрировать проблему AAC как ошибку в Apple.

Проблема с пультом дистанционного управления:

Кнопки пульта дистанционного управления как на экране блокировки, так и на панели уведомлений отправляют событие UIEventSubtypeRemoteControlTogglePlayPause, а не воспроизведение и паузу по отдельности. Поэтому я обрабатываю такие события:

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
  switch (event.subtype) {
    case UIEventSubtypeRemoteControlTogglePlayPause:
      if (controller.playbackState == MPMusicPlaybackStatePlaying) {
          [controller pause];
      } else {
          [controller play];
      }
      break;
     //etc
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...