Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to resume audio playing of other apps after dismissing AVPlayerViewController?

I use AVPlayerViewController to play short videos in my app.

If there is an app playing audio in background before user plays a video in my app, I want the background audio playing of the other app to resume after my video player is dismissed. I currently use AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation) to do that.

Even though Apple's Music app and Podcasts app do resume playing after I call AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)—won't resume without the call so it means this call does have effect—none of the 3rd party music or podcast apps that I tested(Spotify, SoundCloud, Amazon Music, Overcast) do.

Here is my code:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // I know it's not the best place to call setActive nor it covers all the cases. It's just a convenient place to put the code to test its effect after dismissing the video player.
    do {
        try AVAudioSession.sharedInstance().setActive(false, with: .notifyOthersOnDeactivation)
    } catch {
        print(error)
    }
}

@IBAction func play(_ sender: Any) {
    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print(error)
    }

    let playerController = AVPlayerViewController()
    playerController.player = AVPlayer(url: URL(string: "http://gslb.miaopai.com/stream/UkjiD45ddxZFQ79I2bLaGg__.mp4")!)
    playerController.player?.play()
    present(playerController, animated: true)
}

At first I thought it might be these 3rd party apps' fault. But then I tested them with the official Twitter app and found they can resume audio playback after video playing in Twitter app.

So what did I miss? What should I do to make these 3rd party apps resume audio playback after video playing in my app, just as Twitter app does?

PS: here is the complete project so anyone interested can try it.

like image 278
an0 Avatar asked Oct 26 '25 15:10

an0


2 Answers

I want the background audio playing of the other app to resume after my video player is dismissed

You need to accept that that isn't up to you. All you can do is manage your audio session properly. Whether some other app "takes the hint" and resumes its audio is not in your control.

However, you are not quite managing your audio session properly. You should:

  • Use a noninterfering category in general (such as Ambient).

  • Change to your Playback category and activate it only when you need it (i.e. only when we are actually just about to play)

  • When you are done playing, deactivate with notifyOthersOnDeactivation and then switch back to a non-interfering audio category (such as Ambient) and activate it.

Once you've done those things, you've done all you can do. Some apps will resume, others won't.

like image 104
matt Avatar answered Oct 29 '25 06:10

matt


Now I can confirm it is a bug: https://openradar.appspot.com/31733529. And this bug is fixed in iOS 11.

like image 41
an0 Avatar answered Oct 29 '25 07:10

an0



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!