Когда приложение 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 может разрешить или запретить в зависимости от того, что вы делаете.
Что еще более важно, если вы подходите под одну из этих категорий, частота обновления вашего приложения определяется яблочным алгоритмом, который учитывает использование вашего приложения на этом устройстве по сравнению с другими приложениями. Если ваше приложение используется чаще, оно получает больше времени для фона. Это только одна переменная, но вы понимаете, что фоновое распределение времени зависит от приложения, а не под вашим контролем.