我有一个简单的音乐播放器应用程序,遇到了一个非常奇怪的问题。首先,在播放音乐并处于锁定状态时,我允许用户双击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];
}