奇怪条件后,iPodMusicPlayer playbackState不准确

时间:2011-12-15 02:51:33

标签: objective-c audio playback ipod mpmusicplayercontroller

我有一个简单的音乐播放器应用,遇到了一个非常奇怪的问题。首先,在播放音乐和处于锁定状态时,我允许用户双击主页按钮并使用锁定的iPod音乐控件。我确实注意到,在锁定状态下,我的应用程序没有收到任何已注册的通知。在大多数情况下,无论如何这都很好。但是,如果用户在锁定状态下播放音乐至少15分钟(我不确定为什么但不会发生此问题),并使用某种耳机或辅助插孔,则拔出当设备仍在播放音乐时,耳机/辅助插孔,iPodMusicPlayer将自动暂停。这正是我希望它做的,但在此之后,当用户解锁他们的设备并再次关注应用程序时,iPodMusicPlayer的playbackState是不准确的。

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

其中musicPlayer = [MPMusicPlayerController iPodMusicPlayer]

在正常情况下,这完全没问题。但是在这些条件之后,我的断点将在音乐暂停时达到MPMusicPlaybackStatePlaying的条件,反之亦然。我能够解决这个问题的唯一方法是要么选择新的音乐,要么终止应用程序并重新打开。我已经尝试了大量的解决方法来以编程方式解决这个问题,但没有任何结果是100%无错误的修复。有没有人知道为什么会发生这种情况?

4 个答案:

答案 0 :(得分:3)

您也可以尝试以下解决方法:

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

答案 1 :(得分:1)

我遇到了同样的问题,实际上我找到了更多解决问题的方法,最有效的方法是将应用程序放在后台,并从ipod播放器中快速使用播放/暂停按钮几次。在50%的情况下,州都没有被篡改。我也尝试了很多变通方法,但没有办法让我的应用程序工作。我认为iOS框架中存在一个错误,因为文档没有任何改变。

我针对此案例找到了解决方法,详情请参阅:Other StackOverflow question

答案 2 :(得分:0)

同样的问题在我身边。似乎将play调用放在run loop的队列中解决了这个问题(至少在我的上下文中)。您可以使用以下代码进行尝试:

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

答案 3 :(得分:0)

这个问题在iOS 8中仍然存在。我尝试了@matbur建议的方法,它工作了一段时间,但在某些时候停止了工作。所以我绕过整个问题,自己跟踪状态:

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

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

- (void)playAllSound {
    self.isMusicPlaying = YES;
    [self.musicController play];
}