Implementing and Troubleshooting Background Audio in iOS

Viewed 2597

There are a lot of questions relating to background music playback in iOS on StackOverflow. None fully explore all edge cases, the aim of this question is to be the final word in background audio question on iOS

Definitions & Assumptions

All the code, questions and examples refer to .

"background" — The state an app is put into when the user presses the home button or the power button (so the devices displays the lock screen). The app can also be put into background using the multitasking switcher or the multitasking gestures on iPad.

"audio" — Audio played back using AudioQueue (including AVAudioPlayer)

Prerequisites

As I understand it there are 2 requirements to get an app to play audio in the background.

  1. Set UIBackgroundModes to audio in the Info.plist
  2. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

Requirements

My use-case is playing relatively long audio in the background (music). There are potentially hundreds of tracks and the app will play them sequentially. It can be considered that the audio will play indefinitely.

The app will handle interruptions by pausing the playback.

Questions

I've had mixed success with:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:...];

Allowing audio to play in the background. But I'm confused as to if its required and how it differs to:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

Edge Cases

  1. Interruptions. If you register to be notified of audio interruptions (phone calls etc), by becoming the delegate of AVAudioPlayer. For example, if you then pause or stop your audio when an interruption starts and resume when it ends is your app suspended if the interruption exceeds 10 minutes (max time allowed for background tasks to complete)?

  2. The Simulator will stop the audio if Lock or Home are invoked, while using:

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    

However this works on a device. Is this a known issue?

2 Answers
Related