Как сохранить NSTimer при входе приложения в фоновый режим?

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

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

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

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


person UIChris    schedule 23.03.2012    source источник
comment
возможный дубликат фонового повторяющегося задания   -  person Caleb    schedule 23.03.2012


Ответы (3)


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

Общие сведения Исполнение и многозадачность

Вот мой 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
        });
    }
}

}

person bandejapaisa    schedule 23.03.2012
comment
С помощью этой части кода вызываются методы. Он работает нормально, но могу ли я его распространять? - person UIChris; 23.03.2012

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

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

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

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

person Ashley Mills    schedule 23.03.2012
comment
Я спрашиваю свое приложение о местоположении GPS. То же самое и с приложениями, которые постоянно информируют пользователей об их местоположении, например, с навигационным приложением? - person UIChris; 23.03.2012

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

person Caleb    schedule 23.03.2012
comment
Ok. буду раздавать. Я отправляю информацию на сервер о данных GPS. Так что я думаю, что это здорово, верно? Связь с внешним аксессуаром - person UIChris; 23.03.2012
comment
Внешний аксессуар означает что-то подключенное к устройству, а не какой-то сервер в сети. Поэтому, если вы получаете данные GPS от какого-либо GPS-приемника, который обменивается данными, например, через Bluetooth, тогда может работать опция внешнего аксессуара. Если вы получаете данные от собственного GPS-приемника устройства, вместо этого используйте службу определения местоположения. Устройство сообщит вам, когда местоположение изменится. Вам придется изменить свой подход, поскольку вы не можете обновлять сервер через фиксированные промежутки времени. - person Caleb; 23.03.2012
comment
=/ Хорошо. Я очень плохо разбираюсь в IOS. Я понимаю, что вы имеете в виду, но я не знаю, как это сделать - person UIChris; 23.03.2012
comment
@ user1147981: на всякий случай, если вы собираетесь написать это как какое-то приложение для «управления автопарком», вы должны знать, что оно не пройдет проверку (Руководство по проверке App Store) - person Rok Jarc; 23.03.2012