Run app for more than 10 minutes in background
See "Background Execution" section of the iPhoneAppProgrammingGuide. In short, your app must be one of these types:
- Apps that play audible content to the user while in the background, such as a music player app
- Apps that keep users informed of their location at all times, such as a navigation app
- Apps that support Voice over Internet Protocol (VoIP)
- Newsstand apps that need to download and process new content
- Apps that receive regular updates from external accessories
And you must add to the Info.plist as follows: Add the UIBackgroundModes key to your Info.plist file and set its value to an array containing one or more of the following strings:
- audio—The app plays audible content to the user while in the background. (This content includes streaming audio or video content using AirPlay.)
- location—The app keeps users informed of their location, even while it is running in the background.
- voip—The app provides the ability for the user to make phone calls using an Internet connection.
- newsstand-content—The app is aNewsstand app that downloads and processesmagazine or newspaper content in the background.
- external-accessory—The app works with a hardware accessory that needs to deliver updates on a regular schedule through the External Accessory framework.
- bluetooth-central—The app works with a Bluetooth accessory that needs to deliver updates on a regular schedule through the CoreBluetooth framework
Note that part of the review process will be checking to make sure that your app does what it says it's doing with regard to background processing.
Here's what I've done using beginBackgroundTaskWithExpirationHandler.
- Write a method that starts a background task.
- Inside that background task, run a
NSTimer
with a scheduled (non repeating) time that is under 10 minutes. For the purposes of my situation I was using 5 minutes. - Once the
NStimer
's selector fires, end the background task and then instantly call the method that you wrote earlier to start off another background task. - If you want to schedule methods to run at specific times, you will have to check for them in the background task.
This solution isn't really ideal and is still power hungry but will do what you want.
Edit: Since iOS7, I suggest you read this excellent post. Note that this article was last updated in 2013 and is probably irrelevant now.