Когда приложение iOS переходит в фоновый режим, длительные ли задачи приостанавливаются?

Да, я знаю, если я хочу, чтобы мое приложение реагировало на многозадачные действия пользователей, такие как переключение на другое приложение, я должен иметь дело с

- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application

Что, если мое приложение выполняет довольно длительную операцию (например, загрузку большого файла) и пользователь заставляет мое приложение войти в фоновый режим? Будет ли эта операция автоматически приостановлена ​​и возобновлена, когда пользователь вернется в мое приложение?

Что именно произойдет за сценой, когда мое приложение войдет в фоновый режим или возобновит работу на переднем плане?

Что делать, если когда пользователи запускают мое приложение в фоновом режиме, выполнение моего приложения находится в середине метода?

Например, мое приложение делает

for (int i = 1 to 10000K) {
    do some calculation;
}

Когда я == 500K, пользователь переключается на другое приложение. Что происходит с циклом for в моем приложении?

3 ответа

Решение

Из Руководства по программированию приложения для iOS:

Ваше приложение делегат applicationDidEnterBackground: Метод имеет около 5 секунд, чтобы завершить любые задачи и вернуться. На практике этот метод должен возвращаться как можно быстрее. Если метод не возвращается до истечения времени, ваше приложение уничтожается и удаляется из памяти. Если вам все еще нужно больше времени для выполнения задач, позвоните в beginBackgroundTaskWithExpirationHandler: метод для запроса времени выполнения в фоновом режиме и запуска любых длительных задач во вторичном потоке. Независимо от того, запускаете ли вы какие-либо фоновые задачи, applicationDidEnterBackground: метод должен все еще выйти в течение 5 секунд.

Если описанная выше длительная операция выполняется в главном потоке, а после того, как приложение переходит в фоновый режим, требуется больше 5 секунд, ваше приложение будет убито. Основной поток будет заблокирован, и у вас не будет возможности вернуться из -applicationDidEnterBackground: во время.

Если ваша задача выполняется в фоновом потоке (и это действительно должно быть, если выполнение занимает много времени), этот поток будет приостановлен, если приложение вернется из -applicationDidEnterBackground: (согласно обсуждению в этом ответе). Он будет возобновлен, когда приложение вернется на передний план.

Тем не менее, в последнем случае вы все равно должны быть готовы к тому, что ваше приложение будет закрыто в любое время, пока оно находится в фоновом режиме, убирая вещи на пути к фону.

Если вы выполняете какую-либо операцию, которая может потребовать времени, и вы не хотите ее убивать, вы можете продлить время для своей операции, выполнив UIBackground Task i

{
    UIBackgroundTaskIdentifier  taskId = 0;
    taskId = [application beginBackgroundTaskWithExpirationHandler:^{
        taskId = UIBackgroundTaskInvalid;
    }];

// Execute long process. This process will have 10 mins even if your app goes in background mode.

}

Аргумент блока под названием "обработчик" - это то, что произойдет, когда истечет время фоновой задачи (10 минут). Вот ссылка на документацию

Как упоминалось выше, есть несколько случаев, когда ваше приложение работает в фоновом режиме, и Apple может разрешить или запретить в зависимости от того, что вы делаете.

https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

Что еще более важно, если вы подходите под одну из этих категорий, частота обновления вашего приложения определяется яблочным алгоритмом, который учитывает использование вашего приложения на этом устройстве по сравнению с другими приложениями. Если ваше приложение используется чаще, оно получает больше времени для фона. Это только одна переменная, но вы понимаете, что фоновое распределение времени зависит от приложения, а не под вашим контролем.

Другие вопросы по тегам