我正在构建一个使用AVPlayer的应用程序,并将其设置为在后台运行时使用锁屏控件进行操作。我已经适当地实现了以下内容:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[[AVAudioSession sharedInstance] setActive: YES error: &error];
我已经正确配置了MPNowPlayingInfoCenter
。
我遇到的一个错误是,当我希望在播放其他应用程序(例如Spotify)中的音乐后继续播放时,锁定屏幕的控件无法正常工作。
为了重现此错误,我开始从我的应用播放音频,当我的AVPlayer播放时,会调用setActive
。然后,我切换到Spotify并播放一首歌曲,音频消失并暂停。几秒钟后,我切换回我的应用并恢复音频。当我锁定设备并在锁定屏幕上按按钮时,我在屏幕上看到音频信息,但是我的所有控件都无法正常工作。
beginReceivingRemoteControlEvents
在启动时在我的appDelegate的applicationDidBecomeActive
中被调用
我的appDelegate的dealloc方法中确实有endReceivingRemoteControlEvents
(这是我继承的旧代码),但是在这种情况下没有调用。
编辑:我忘了要注意,我正在运行iOS11.4的iPad上进行测试
编辑2:抱歉,我没有提到在更新到iOS11.4之前,这种方法工作正常
编辑3:我发现了问题,它是埋在我们原有代码中的布尔标志,没有被重置
答案 0 :(得分:1)
商店中有一个音乐播放器,所以我想尝试一下您的问题。
尝试使用MyApp> Spotify> MyApp路由后,您定义了我无法重现该错误。信息中心按钮正常工作。
我们正在beginReceivingRemoteControlEvents
呼叫applicationDidEnterBackground
。此时我们也叫addTargetWithHandler
。还有endReceivingRemoteControlEvents
处的applicationDidBecomeActive
。像这样:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
MPRemoteCommandCenter *remoteCommandCenter = [MPRemoteCommandCenter sharedCommandCenter];
[remoteCommandCenter.playCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus (MPRemoteCommandEvent *event) {
//....
}];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
}
当您的应用程序在后台时,将使用MPRemoteCommandCenter的性质。
问题可能是事物的顺序。
答案 1 :(得分:0)
Spotify正在中断您的音频会话,因此它不再处于活动状态,因此您的应用程序不再是“正在播放”应用程序,并且不再接收远程控制事件。
您需要致电
if (![[AVAudioSession sharedInstance] setActive:YES error:&error]) {
// do something about error
}
再次在某个时刻,当您的应用返回到前台或中断结束时(通过观察AVAudioSessionInterruptionNotification
通知,如果您想从电话和其他中断事件中恢复过来,这很重要)。 Responding to Audio Session Interruptions document中提供了更多信息。