Как сохранить NSTimer при входе приложения в фоновый режим? - PullRequest
8 голосов
/ 23 марта 2012

Я здесь, потому что я не нашел решения для моей проблемы: (

Я делаю простое приложение, в котором мне нужно отправить (по сокету) некоторую информацию на сервер (например,GPS l / L, точность, уровень заряда батареи и т. Д.).

Текущий код работает нормально, когда приложение находится на переднем плане.

myTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0 target:self
                                                  selector: @selector(sendPosToServer:) userInfo:nil repeats: YES];
myTimer2 = [NSTimer scheduledTimerWithTimeInterval: 3.0 target:self
                                                  selector: @selector(sendBatteryToServer:) userInfo:nil repeats: YES];
myTimer3 = [NSTimer scheduledTimerWithTimeInterval: 5.0 target:self
                                                  selector: @selector(sendResToServer:) userInfo:nil repeats: YES];
myTimer4 = [NSTimer scheduledTimerWithTimeInterval: 5.0 target:self
                                                  selector: @selector(sendQResToServer:) userInfo:nil repeats: YES];
myTimer5 = [NSTimer scheduledTimerWithTimeInterval: 3.0 target:self
                                                   selector: @selector(sendPrecisionToServer:) userInfo:nil repeats: YES];

Вызываются все эти методы.

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

Мне нужна ваша помощь:)

Спасибо всем !!

Ответы [ 3 ]

11 голосов
/ 23 марта 2012

Вам необходимо прочитать руководство о том, как запускать задачи в фоновом режиме:

Фоновое выполнение и многозадачность

Вот мой applicationDidEnterBackground для одного из моих приложений.Когда я помещаю его в фоновый режим, он выполняет некоторое обслуживание дискового кэша:

- (void)applicationDidEnterBackground:(UIApplication *)application {

//As we are going into the background, I want to start a background task to clean up the disk caches
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4
    if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking
        UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance

        __block UIBackgroundTaskIdentifier background_task; //Create a task object

        background_task = [application beginBackgroundTaskWithExpirationHandler: ^{
            [application endBackgroundTask:background_task]; //Tell the system that we are done with the tasks
            background_task = UIBackgroundTaskInvalid; //Set the task to be invalid
            //System will be shutting down the app at any point in time now
        }];

        //Background tasks require you to use asyncrous tasks
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //Perform your tasks that your application requires                

            //I do what i need to do here.... synchronously...                

            [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform
            background_task = UIBackgroundTaskInvalid; //Invalidate the background_task
        });
    }
}

}

5 голосов
/ 23 марта 2012

Из документов Apple:

Реализация длительных фоновых задач Для задач, которые требуют больше Время выполнения для реализации, вы должны запросить конкретные разрешения для запустить их в фоновом режиме, не останавливая их. Только в iOS определенные типы приложений могут работать в фоновом режиме:

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

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

4 голосов
/ 23 марта 2012

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

...