Подтвердить что ты не робот

Приложение iOS выполняет задания в фоновом режиме

Мне было интересно, могу ли я отправлять некоторые вызовы webservice, пока мое приложение находится в фоновом режиме. Как это делает скайп? Даже если я нажимаю кнопку "домой", мой звонок остается подключенным.

4b9b3361

Ответ 1

Основываясь на том, что указано rckoenes, приложениям разрешено регистрировать фоновые задачи, которые должны быть выполнены после того, как пользователь нажимает кнопку "домой". Срок выполнения этих задач составляет 10 или 15 минут. Опять же, вы можете зарегистрировать задачу для завершения сразу после того, как пользователь наносит ответный удар домой, это НЕ позволяет выполнять код через час после выхода из приложения.

UIApplication*    app = [UIApplication sharedApplication];
task = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:task];
        task = UIBackgroundTaskInvalid;
    }];
// Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task.
        NSLog(@"Started background task timeremaining = %f", [app backgroundTimeRemaining]);
        if (connectedToNetwork) {
            // do work son...
        }

        [app endBackgroundTask:task];
        task = UIBackgroundTaskInvalid;
    });

ОБНОВЛЕНИЕ: если ваше приложение поддерживает версии iOS, предшествующие iOS 4, вы также должны проверить, поддерживает ли многозадачность до регистрации фоновой задачи. Используйте что-то по строкам:

UIDevice* device = [UIDevice currentDevice];

BOOL backgroundSupported = NO;

if ([device respondsToSelector:@selector(isMultitaskingSupported)])

   backgroundSupported = device.multitaskingSupported;

Ответ 2

Попробуйте это... Отличный код для запуска приложения в фоновом режиме без ограничения по времени. (Я тестировал его для загрузки более 600 мб данных из веб-сервиса.)

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication *app = [UIApplication sharedApplication];
    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
        [app endBackgroundTask:bgTask]; 
    }];
 }

Обновление::

вы можете найти дополнительную информацию о мультитаксинге в этом яблочном документе Выполнение фона.

Пожалуйста, проверьте на устройстве.

Ответ 3

Это зависит от того, какое приложение вы пытаетесь закодировать. Skype зарегистрирован как приложение VoIP (Long-running app), и поэтому он может оставаться "запущенным", хотя он находится на заднем плане.

Apple отделяет приложения от трех:

  • Выполнение задач конечной длины (вы можете запускать задачи в течение конечного времени)
  • Загрузка содержимого в фоновом режиме (вы можете загрузить контент, чтобы представить его пользователю, когда приложение снова активируется)
  • Реализация задач Long-Running (это самая интересная категория приложений для фона, с некоторыми подкатегориями, которые разработчик должен определить для вашего приложения)

    • Приложения, воспроизводящие звуковой контент для пользователя в фоновом режиме, например, приложение для музыкального проигрывателя.
    • Приложения, которые записывают аудиоконтент в фоновом режиме
    • Приложения, которые постоянно информируют пользователей о своем местоположении, например навигационное приложение
    • Приложения, поддерживающие передачу голоса по интернет-протоколу (VoIP) (SKYPE здесь)
    • Приложения, которые необходимо регулярно скачивать и обрабатывать.
    • Приложения, регулярно получающие обновления от внешних аксессуаров

Итак, вам нужно оценить, в какой категории ваше приложение и что выполняет ваша операция. Возможно, если вы отправляете некоторые мелочи в службу, лучший подход - это просто запросить дополнительное время на заднем плане для выполнения задания.

Подробнее обо всем этом по этой ссылке:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html