приложение iOS, выполняющее задачи в фоновом режиме

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

3 ответов


основываясь на том, что заявил 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;
    });

UPDATE: если ваше приложение поддерживает версии iOS, предшествующие iOs 4, вы также должны проверить перед регистрацией фоновой задачи убедитесь, что поддерживается многозадачность. Используйте что-то вроде:

UIDevice* device = [UIDevice currentDevice];

BOOL backgroundSupported = NO;

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

   backgroundSupported = device.multitaskingSupported;

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

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

Update ::

вы можете найти более подробную информацию о multitaksing в этом Apple doc Фоновый.

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


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

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

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

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

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

дополнительная информация обо всем этом находится по этой ссылке:

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