我有一个简单的音乐播放器应用,遇到了一个非常奇怪的问题。首先,在播放音乐和处于锁定状态时,我允许用户双击主页按钮并使用锁定的iPod音乐控件。我确实注意到,在锁定状态下,我的应用程序没有收到任何已注册的通知。在大多数情况下,无论如何这都很好。但是,如果用户在锁定状态下播放音乐至少15分钟(我不确定为什么但不会发生此问题),并使用某种耳机或辅助插孔,则拔出当设备仍在播放音乐时,耳机/辅助插孔,iPodMusicPlayer将自动暂停。这正是我希望它做的,但在此之后,当用户解锁他们的设备并再次关注应用程序时,iPodMusicPlayer的playbackState是不准确的。
- (IBAction)playPause:(id)sender {
if ([musicPlayer playbackState] == MPMusicPlaybackStatePlaying) {
[musicPlayer pause];
} else {
[musicPlayer play];
}
}
其中musicPlayer = [MPMusicPlayerController iPodMusicPlayer]
。
在正常情况下,这完全没问题。但是在这些条件之后,我的断点将在音乐暂停时达到MPMusicPlaybackStatePlaying的条件,反之亦然。我能够解决这个问题的唯一方法是要么选择新的音乐,要么终止应用程序并重新打开。我已经尝试了大量的解决方法来以编程方式解决这个问题,但没有任何结果是100%无错误的修复。有没有人知道为什么会发生这种情况?
答案 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];
}