Continue operation when app did enter background on iOS

Piero picture Piero · Nov 27, 2012 · Viewed 12.1k times · Source

in my app i have some NSOperation that update some core data element from a online database, sometime the update require some minute, and when the screen of iPhone lock, the app enter in the background mode, and this update is stopped, so i have to reopen the app to continue the update, so i have search a lot on stack overflow and i have find some information about:

beginBackgroundTaskWithExpirationHandler

that is a method from apple that let continue some task also when the app is in the background mode, and i have do this:

- (void)applicationDidEnterBackground:(UIApplication *)application
{

UIApplication  *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
}];
}

and now the app continue the task in the background, and seems that all works fine, so my question is, this method i use is safe? or there is a better mode?

thanks

Answer

rmaddy picture rmaddy · Nov 27, 2012

That's not how you do this. Any code that you want to run in the background must be wrapped properly. Something like this:

- (void)someMethodToKeepRunningInBackground {
    UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
        // Uh-oh - we took too long. Stop task.
    }];

    // Perform task here        

    if (taskId != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:taskId];
    }
}

You don't do anything in the UIApplicationDelegate applicationDidEnterBackground: method.

Any task that is wrapped inside the "background task" calls will be allowed to keep running when the app enters the background.

Here's the really important part - the task only gets 10 minutes maximum. If it is still running after 10 minutes your app will be terminated. The expiration handler gives you a few seconds to cleanly end the task before the app is terminated uncleanly.