MPRemoteCommandCenter not available after changing audio session category

728 Views Asked by At

My app has got the option to allow its sound to be mixed with other apps. According to Apple, MPRemoteCommandCenter is only available when apps do not allow for mixing.

Inside my app, when the user taps the button to change the mixWithOthers setting, the audio session is set accordingly.

However, even when the user switches back to not allow mixing anymore MPRemoteCommandCenter will not show up in lock screen until the app has been removed from cache (swiped up) and started again.

Is there a way to achieve the desired behaviour without having to re-start the app?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
  UIApplication.shared.beginReceivingRemoteControlEvents()
}

var isMixWithOthersAllowed: Bool

func startProcess() {
  setAudioSession {
   setupMediaControls()
  }
}

func setAudioSession(completion: @escaping () -> Void) {
  let audioSession = AVAudioSession.sharedInstance()

  do {

    if isMixWithOthersAllowed {
      try audioSession.setCategory(.playback, options: [.mixWithOthers])
      /* The remote command center will not be available when mixing with others, 
        as stated by Apple in the docs. */
    } else {
      try audioSession.setCategory(.playback) 
      /* The remote command center should be available when switching back to 
         this category, but it will only show up after the app has been killed 
         and started fresh again. I'd like it to be available without restarting 
         the application. */
    }

    try audioSession.setActive(true)

  } catch let error as NSError {
    configureAudioSessionError = error
  }
  assert(configureAudioSessionError == nil, "Create audio session failed")

  completion()
}


func setupMediaControls() {
  let commandCenter = MPRemoteCommandCenter.shared()

  commandCenter.playCommand.isEnabled = true
  commandCenter.pauseCommand.isEnabled = true
  commandCenter.nextTrackCommand.isEnabled = true
  commandCenter.previousTrackCommand.isEnabled = true

  // Setup handlers for commands
  // ...

  setupNowPlaying()
}

func setupNowPlaying() {
  // Configure audio track metadata and update UI elements
}
0

There are 0 best solutions below