当applicationDidEnterBackground:
触发时,我会暂停使用AVAudioPlayer
播放的音频:
[self.avPlayer pause];
现在,当applicationWillEnterForeground:
触发时,音频会自动开始播放!由于我没有启动音频,因此用户界面未更新,并且显示音频仍处于暂停状态。
发生了什么事?这种情况发生在iOS 6.x,iPad 2上。这个问题不能在运行iOS 5.x的旧版iPad上重现。
这是我设置AVAudioSession
:
// Setup the audio session
BOOL succeeded = NO;
NSError *sessionError = nil;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setDelegate:self];
if ([session respondsToSelector:@selector(setPreferredSampleRate:error:)]) {
succeeded = [session setPreferredSampleRate:128000.0f error:&sessionError];
} else {
succeeded = [session setPreferredHardwareSampleRate:128000.0f error:&sessionError];
}
succeeded = [session setCategory:AVAudioSessionCategorySoloAmbient error:&sessionError];
succeeded = [session setActive:YES error:&sessionError];
答案 0 :(得分:1)
在我最近的一个应用程序中,我发现了一个类似的问题,音频播放自动暂停,并在您被呼叫打断后恢复,并且我的应用程序中的GUI没有刷新。我已使用以下方法解决了该问题:
在处理播放器代码的课程中注册
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
使用AVAudioSession
的{{1}}委托方法在应用程序恢复后获得控制权。在此功能中,您可以相应地恢复播放和更新UI。
audioPlayerEndInterruption
希望这有帮助。
答案 1 :(得分:1)
我发现了一些奇怪的用户体验,当我从后台来回走动并根据一堆帖子时,我计划稍微摇晃一下手柄。我做了一件相当简单的事 - 检查应用程序进入前台时是否正在播放其他音乐:
func applicationWillEnterForeground(application: UIApplication) {
if AVAudioSession.sharedInstance().otherAudioPlaying{
NSNotificationCenter.defaultCenter().postNotificationName(Notifications.ForegroundEnteredWithOtherAudioPlaying, object: nil)
}
}
如果是,您可以在收到通知时暂停播放器。你提到它没有用,但没有看到你的其余代码,很难知道原因。
我要做的另一件事就是从播放器项中删除status
标志的观察者,因为我听到ReadyToPlay
值,我告诉AvPlayer
实际上玩。当应用程序进入前台并且存在活动的音频会话时会被触发。因此,通过在暂停时移除观察者并在每次进场时设置它(这并不是因为我认为这是一个好的约束,说我打算在玩之后只注意观察) ,我能够控制很多怪异。
我还写了一堆测试用例,我将在这里分享,以确保您的体验状态良好。它并不全面,但它也相当彻底。
// 1. Play, leave app, don't open anything else, come back
// 2. Play, leave app, open an app that plays music, come back
// 3. Play, leave app, open an app that plays music, play music, come back
// 4. Play, let audio go for 5 seconds, pause, open an app that plays music, come back
// 5. Play, let audio go for 5 seconds, pause, open an app that plays music, play music, come back
// 6. Press play, leave app before playback starts, open an app that plays music, come back
// 7. Crazy s$*t like play, leave app, open an app that plays music, play music, come back, tap a different song
答案 2 :(得分:0)
HRM的解决方案对我不起作用。我得到它以避免自动恢复播放的唯一方法是使用stop:[self.avPlayer stop]
答案 3 :(得分:0)
我也遇到了同样的问题。所以我在 UIApplicationWillResignActive 上注册了我的班级,并在收到通知时暂停了音频。
答案 4 :(得分:0)
关于这个荒谬的问题。这似乎确实是iOS中的一个普通错误。
我们能找到的唯一真正的解决方案
在所有三个委托调用中..
func applicationWillResignActive(_ application: UIApplication) {
yourPlayer.handleAppResign()
}
func applicationDidEnterBackground(_ application: UIApplication) {
yourPlayer.handleAppResign()
}
func applicationWillTerminate(_ application: UIApplication) {
yourPlayer.handleAppResign()
}
然后在处理该特定案件的地方,您将拥有:
func ...handleThat() {
yourAVPlayer?.rate = 0
}
实际上只需添加以下内容:
func ...handleThat() {
yourAVPlayer?.rate = 0
yourAVPlayer = nil
}
通常您不会这样做,因为您通常只是暂停一下。
但是,实际上,这似乎是疯狂的“苹果自动取消暂停”行为的唯一解决方案。
似乎没有其他办法。