在奇怪的情况下iPodMusicPlayer播放状态不准确



我有一个简单的音乐播放器应用程序,遇到了一个非常奇怪的问题。首先,在播放音乐并处于锁定状态时,我允许用户双击Home键并使用锁定的iPod音乐控制。然而,我注意到,在锁定状态下,我的应用程序不会收到任何注册通知。在大多数情况下,这是好的。但是,如果用户在锁定状态下播放音乐至少15分钟(我不确定为什么,但如果少于15分钟,这个问题就不会发生),并且使用某种耳机或辅助插孔,然后在设备仍在播放音乐时拔掉耳机/辅助插孔,iPodMusicPlayer将自动暂停。这正是我想要它做的,但在此之后,当用户解锁设备并再次将焦点交给应用程序时,iPodMusicPlayer的playbackState是不准确的。

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

其中musicPlayer = [MPMusicPlayerController iPodMusicPlayer] .

在正常情况下,这运行得非常好。但是在这些条件之后,当音乐暂停时,我的断点将达到MPMusicPlaybackStatePlaying的条件,反之亦然。我能解决这个问题的唯一方法是要么重新选择音乐,要么终止应用程序并重新打开。我已经尝试了大量的变通方法来解决这个问题,但没有一个是100%无bug的修复。有人知道为什么会发生这种事吗?

您也可以尝试以下方法:

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

我遇到了同样的问题,事实上我发现了更多的方法来解决这个问题,最有效的方法是把应用程序放在后台,从ipod播放器使用播放/暂停按钮几次非常快。在50%的情况下,状态不同步。我也尝试了很多变通方法,但没有办法让我的应用程序工作。我认为iOS框架中有一个bug,因为文档没有以任何方式改变。

我找到了一个解决这个问题的方法,详细说明如下:

我也遇到了同样的问题。似乎将play调用放在运行循环的队列上解决了这个问题(至少在我的上下文中)。你可以试试下面这行代码:

[musicPlayer performSelector:@selector(play) withObject:nil afterDelay: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];
}

最新更新