Определить BackgroundTaskWithExpirationHandler in applicationDidEnterBackground: вот так:
// ...
UIBackgroundTaskIdentifier bti;
// ...
- (void)applicationDidEnterBackground:(UIApplication *)application {
bti = [application beginBackgroundTaskWithExpirationHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
if(bti != UIBackgroundTaskInvalid) {
[application endBackgroundTask:bti];
bti = UIBackgroundTaskInvalid;
}
});
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// DO or CONTINUE RESUMED DOWNLOAD HERE
dispatch_async(dispatch_get_main_queue(), ^{
if(bti != UIBackgroundTaskInvalid) {
[application endBackgroundTask:bti];
bti = UIBackgroundTaskInvalid;
}
});
});
}
Чтобы увидеть, как это работает, скачайте пример проекта Я сделал для Вас.
git clone https://gitlab.com/jacekmigacz/BTWEH.git
... и нажмите кнопку Home , чтобы вызвать applicationDidEnterBackground:.
Идея состоит в том, чтобы делегировать вашу задачу загрузки другому, привилегированному потоку и держать ваше приложение в фоновом режиме вместо того, чтобы ОС приостановила его.