Воспроизведение iPodMusicPlayerСостояние неточное после нечетных условий - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть простое приложение для воспроизведения музыки, которое сталкивается с очень странной проблемой. Прежде всего, во время воспроизведения музыки и в заблокированном состоянии я позволяю пользователю дважды щелкнуть кнопку «Домой» и использовать заблокированные элементы управления музыкой iPod. Однако я заметил, что, находясь в заблокированном состоянии, мое приложение не получает никаких зарегистрированных уведомлений. По большей части, это хорошо в любом случае. Но если пользователь воспроизводит музыку в течение как минимум 15 минут (я не уверен, почему, но меньше, и эта проблема не возникает) в заблокированном состоянии и с использованием какого-либо разъема для наушников или вспомогательного разъема, то отключите Разъем наушников / aux, пока устройство все еще воспроизводит музыку, iPodMusicPlayer автоматически приостановит воспроизведение. Это именно то, чего я бы хотел, но после того, как это произойдет, когда пользователь разблокирует свое устройство и снова сфокусирует внимание на приложении, PlayState от iPodMusicPlayer будет неточным.

- (IBAction)playPause:(id)sender {
     if ([musicPlayer playbackState] == MPMusicPlaybackStatePlaying) {
         [musicPlayer pause];    
     } else {
         [musicPlayer play];
     }
 }

где musicPlayer = [MPMusicPlayerController iPodMusicPlayer].

В нормальных условиях все работает отлично. Но после этих условий моя точка останова достигнет условия для MPMusicPlaybackStatePlaying, пока музыка находится в режиме паузы, и наоборот. Единственный способ, которым я смог это исправить, - это либо сделать новый выбор музыки, либо закрыть приложение и снова открыть. Я пробовал множество обходных путей, чтобы решить эту проблему программно, но ничего не получается на 100% без ошибок. Кто-нибудь знает, почему это происходит в первую очередь?

Ответы [ 4 ]

3 голосов
/ 27 апреля 2012

Вы также можете попробовать этот обходной путь:

 - (IBAction)playPause:(id)sender {
      if ([musicPlayer playbackState] == MPMusicPlaybackStatePlaying) {
          [musicPlayer play];    
          [musicPlayer pause];    
      } else {
          [musicPlayer pause];
          [musicPlayer play];
      }
  }
1 голос
/ 12 апреля 2012

У меня точно такая же проблема, на самом деле я нашел больше способов ее решить, и самый эффективный из них - перевести приложение в фоновый режим, а в плеере ipod несколько раз очень быстро нажмите кнопку воспроизведения / паузы.,в 50% случаев штаты не синхронизируются.Я также попробовал много обходных путей, но нет никакого способа заставить мое приложение работать.Я думаю, что в структуре iOS есть ошибка, так как документы не изменились.

Я нашел обходной путь для этого случая, который подробно описан здесь: Другой вопрос StackOverflow

0 голосов
/ 23 октября 2014

Эта проблема все еще сохраняется в iOS 8. Я попробовал метод, предложенный @matbur, он работал некоторое время, но в какой-то момент перестал работать.Поэтому я обошел всю проблему , следя за состоянием самого себя:

- (void)viewDidLoad {
    self.isMusicPlaying = NO;
}

- (void)pauseAllSound {
    self.isMusicPlaying = NO;
    [self.musicController pause];
}

- (void)playAllSound {
    self.isMusicPlaying = YES;
    [self.musicController play];
}
0 голосов
/ 05 июля 2012

Такая же проблема на моей стороне.Кажется, что включение вызова воспроизведения в очередь цикла выполнения решает эту проблему (по крайней мере, в моем контексте).Вы можете попробовать это с этой строкой кода:

[musicPlayer performSelector:@selector(play) withObject:nil afterDelay:0];
...