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

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

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

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

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

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

Например, мое приложение выполняет

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

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

Ответы [ 3 ]

72 голосов
/ 11 июля 2011

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

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

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

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

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

10 голосов
/ 02 июня 2013

Если вы выполняете какую-либо операцию, которая может занять некоторое время, и вы не хотите ее убивать, вы можете продлить время для своей операции, выполнив 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 минут). Вот ссылка на документацию

0 голосов
/ 11 ноября 2013

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

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

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

...