Implementing Long-Running Background Tasks
For tasks that require more execution time to implement, you must request specific permissions to run them in the background without their being suspended. In iOS, only specific app types are allowed to run in the background:
-
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
Apps that implement these services must declare the services they support and use system frameworks to implement the relevant aspects of those services. Declaring the services lets the system know which services you use, but in some cases it is the system frameworks that actually prevent your application from being suspended.
- (void)applicationDidEnterBackground:(UIApplication *)application |
{ |
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ |
// Clean up any unfinished task business by marking where you |
// stopped or ending the task outright. |
[application endBackgroundTask:bgTask]; |
bgTask = UIBackgroundTaskInvalid; |
}]; |
|
// Start the long-running task and return immediately. |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ |
|
// Do the work associated with the task, preferably in chunks. |
|
[application endBackgroundTask:bgTask]; |
bgTask = UIBackgroundTaskInvalid; |
}); |
} |