Background Modes Tutorial: Getting Started
In this tutorial, you’ll create an app that uses audio playback, location updates, critical tasks, and background fetch to learn about the most common background modes. By Chuck Krutsinger .
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Contents
Background Modes Tutorial: Getting Started
25 mins
- Getting Started
- Playing Audio
- Giving Credit Where Credit Is Due
- Testing Audio in the Background
- Receiving Location Updates
- Enabling Location Updates
- Testing Location Mode in the Background
- Completing Critical Tasks Upon Moving to the Background
- When to Use Task Completion
- Setting Up a Completion Task
- Ending the Completion Task
- Registering and Ending Background Tasks
- Background Fetch
- Understanding Background Fetch
- Implementing Background Fetch
- Testing Background Fetch
- Where to Go From Here?
Apple started allowing apps to do work in the background in 2010 with the release of iOS 4 and has evolved and improved background modes since then. iOS restricts the use of background operations to improve user experience and extend battery life. Your app can run in the background for specific use cases, including: playing audio, updating location and fetching the latest content from a server.
If your task doesn’t fall into one of the permitted categories, backgrounding may not be for you. You could face one of those dreaded App Store rejections if you try to game the system with background modes that operate beyond the scopes of their purposes. Consider yourself warned!
In this background modes tutorial, you’ll learn about four things your apps can do in the background:
- Play audio: Allow the app to continue playing audio in the background.
- Receive location updates: Enable the app to receive location changes in the background.
- Complete finite-length critical tasks: Enable the app continue to complete a critical task after moving to the background.
- Background Fetch: Perform background updates on a schedule determined by iOS.
Getting Started
Download the project files at the top or bottom of the tutorial by clicking the Download Materials button. The user interface and core logic are already built.
Before digging in, here’s a quick overview of the basic background modes available in iOS:
- Audio, AirPlay, and Picture in Picture: Play audio and video while the app is in the background.
- Location Updates: Continue to receive location updates when in the background.
- Voice over IP: Send and receive voice over the internet.
- External accessory communication: Communicate via the lightning port with external accessories.
- Using Bluetooth LE accessories: Communicate with Bluetooth LE accessories while in the background.
- Acting as a Bluetooth LE accessory: Allow the app to serve Bluetooth LE information to an accessory.
- Background fetch: Perform data refreshes.
- Remote notitifications: Send and receive remote notifications.
- Background processing: Perform longer critical processes.
You’re going to add four of the above modes to the sample app – audio, location, background processing and background fetches. If you’re only interested in some of these modes, feel free to skip around and just play with the modes that interest you.
Before you can run the project on a physical device, you must set your development team, as shown here:
Build and run the sample project to get a feel for Sleepless, an app that never rests because it does things in the background. There are four tabs — one to cover each mode:
The first capability you’re going to add is background audio.
Playing Audio
Build and run Sleepless on a physical device. Navigate to the audio tab, play the music, and then put the app in the background by returning to the home screen. The music will stop playing.
Open AudioModel.swift.
The app makes use of AVQueuePlayer
to queue up songs and play them in sequence. The model observes the player’s currentItem
value to provide updates to the view.
Giving Credit Where Credit Is Due
The starter project includes audio files from incompetech.com, a popular royalty-free music website. You can use the music for free with atttribution. All three songs are by Kevin MacLeod:
- “Feelin Good” Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/ - “Iron Bacon” Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/ - “What You Want” Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/
- “Feelin Good” Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/ - “Iron Bacon” Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/ - “What You Want” Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/
Thanks for the wonderful music, Kevin!
Testing Audio in the Background
Why does the music stop when the app enters the background? Well, a crucial piece is missing!
Most background modes won’t work unless you enable specific capabilities that indicate that the app wants to run code in the background. The exception is critical task completion, which any app can perform.
When activated, the audio background mode tells iOS to continue playing audio even though the app is in the background. That’s right — the audio background mode is virtually automatic. You just have to activate it.
Return to Xcode and do the following:
- Click the project in the Project navigator.
- Select SleeplessApp target.
- Select the Signing & Capabilities tab.
- Click on the + symbol to add a capability.
Next, double-click Background Modes to add this capability. Expand the Background Modes capability, then check the Audio, AirPlay, and Picture in Picture box to enable background audio.
Build and run the app on a physical device. Start the music as before, then leave the app. This time the audio will continue. It’s that simple!
Next, you’ll use the Location updates background mode to continue to receive location updates even when the app is in the background.
Receiving Location Updates
First, build and run the app. Choose the Location tab and tap Start. Nothing happens yet because you’re missing some important steps. You’ll change that now.
Enabling Location Updates
Open LocationModel.swift. This is the code that provides location data to the LocationView. You’re going to make a simple change to init()
. Replace following two lines:
mgr.requestWhenInUseAuthorization()
mgr.allowsBackgroundLocationUpdates = false
With:
mgr.requestAlwaysAuthorization()
mgr.allowsBackgroundLocationUpdates = true
The first line requests location updates even when the app is not in use. The second requests updates even in the background.
Go back to the Signing & Capabilities screen and check the box for Location updates to let iOS know that your app wants to receive location updates while in the background.
In addition to checking this box, iOS requires that you set a key in your Info.plist explaining to the user why you need background updates. If you don’t include this, location requests will silently fail.
Open Info.plist and add the keys for Privacy — Location Always and When In Use Usage Description and Privacy — Location When In Use Usage Description. Then type The app will show your location on a map as the value for both keys.
Now, build and run! Switch to the Location tab and tap Start.
When it loads the first time, you’ll see the message that you wrote into your location privacy reason.
Tap Allow while using app and take a walk outside or around your building — try not to get too distracted catching Pokemons.
Location updates should start to appear. If they don’t, send the app to the background again to trigger the Always prompt for location tracking. You can also use the Settings app to enable always tracking by the Sleepless app in the Privacy ▸ Location Services ▸ Sleepless settings.
If you send the app to the background, you’ll still see location updates occurring in the console.
After a while, you should see something like this: