How to keep an iPhone app running on background fully operational How to keep an iPhone app running on background fully operational objective-c objective-c

How to keep an iPhone app running on background fully operational


From ioS 7 onwards, there are newer ways for apps to run in background. Apple now recognizes that apps have to constantly download and process data constantly.

Here is the new list of all the apps which can run in background.

  1. Apps that play audible content to the user while in the background, such as a music player app
  2. Apps that record audio content while in the background.
  3. Apps that keep users informed of their location at all times, such as a navigation app
  4. Apps that support Voice over Internet Protocol (VoIP)
  5. Apps that need to download and process new content regularly
  6. Apps that receive regular updates from external accessories

You can declare app's supported background tasks in Info.plist using X Code 5+. For eg. adding UIBackgroundModes key to your app’s Info.plist file and adding a value of 'fetch' to the array allows your app to regularly download and processes small amounts of content from the network. You can do the same in the 'capabilities' tab of Application properties in XCode 5 (attaching a snapshot)

Capabilities tab in XCode 5You can find more about this in Apple documentation


You can perform tasks for a limited time after your application is directed to go to the background, but only for the duration provided. Running for longer than this will cause your application to be terminated. See the "Completing a Long-Running Task in the Background" section of the iOS Application Programming Guide for how to go about this.

Others have piggybacked on playing audio in the background as a means of staying alive as a background process, but Apple will only accept such an application if the audio playback is a legitimate function. Item 2.16 on Apple's published review guidelines states:

Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc


If any background task runs more than 10 minutes,then the task will be suspended and code block specified with beginBackgroundTaskWithExpirationHandler is called to clean up the task. background remaining time can be checked with [[UIApplication sharedApplication] backgroundTimeRemaining].Initially when the App is in foreground backgroundTimeRemaining is set to bigger value. When the app goes to background, you can see backgroundTimeRemaining value decreases from 599.XXX ( 1o minutes). once the backgroundTimeRemaining becomes ZERO, the background task will be suspended.

        //1)Creating iOS Background Task        __block UIBackgroundTaskIdentifier background_task;        background_task = [application beginBackgroundTaskWithExpirationHandler:^ {               //This code block is execute when the application’s                //remaining background time reaches ZERO.          }];        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{            //### background task starts            //#### background task ends        });        //2)Making background task Asynchronous        if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])        {            NSLog(@"Multitasking Supported");            __block UIBackgroundTaskIdentifier background_task;            background_task = [application beginBackgroundTaskWithExpirationHandler:^ {                //Clean up code. Tell the system that we are done.                [application endBackgroundTask: background_task];                background_task = UIBackgroundTaskInvalid;            }];        **//Putting All together**            //To make the code block asynchronous            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{                //### background task starts                NSLog(@"Running in the background\n");                while(TRUE)                {                    NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);                    [NSThread sleepForTimeInterval:1]; //wait for 1 sec                }                //#### background task ends                //Clean up code. Tell the system that we are done.                [application endBackgroundTask: background_task];                background_task = UIBackgroundTaskInvalid;             });        }        else        {            NSLog(@"Multitasking Not Supported");        }