切换音乐应用后,应用不再从锁定屏幕接收控制事件

时间:2018-06-27 14:53:21

标签: ios objective-c avplayer lockscreen avaudiosession

我正在构建一个使用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:我发现了问题,它是埋在我们原有代码中的布尔标志,没有被重置

2 个答案:

答案 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中提供了更多信息。