UIПриложение. Фоновое выполнение в течение фиксированного периода времени

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

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

Итак, резюмируя мои вопросы:

  1. Можно ли заставить приложение выполняться в фоновом режиме в течение x> 10 минут?

2. Есть ли у меня другие варианты чего-то подобного? (фактическое приложение, в котором мне это нужно, получает обновления местоположения в фоновом режиме, пользователь может использовать телефон в фоновом режиме до 30 минут, и внезапно не получать обновления было бы плохо)

 -  (void)viewDidLoad {
    [super viewDidLoad];

    counterTask = [[UIApplication sharedApplication]
               beginBackgroundTaskWithExpirationHandler:^{
                   // do something                   }];
    count=0;
    theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1
                                          target:self
                                        selector:@selector(countUp)
                                        userInfo:nil
                                         repeats:YES];
}




- (void)countUp {

    if (count==10000) {
        [theTimer invalidate];

        [[UIApplication sharedApplication] endBackgroundTask:counterTask];
    } else {
        NSLog(@"asd");
        count++;
        NSString *currentCount;
        currentCount=[[NSString alloc] initWithFormat:@"%d",count];
        _theCount.text=currentCount;

        long seconds = lroundf([[UIApplication sharedApplication] backgroundTimeRemaining]);

        NSLog([NSString stringWithFormat:@"%ld",seconds]);

    }
}

person Anders    schedule 15.09.2014    source источник


Ответы (2)


Я где-то читал, что 10 минут — это максимальное время, которое мы можем выполнять в фоновом режиме, и нет никакого способа превысить это время(?). Однако мой код будет выполняться в фоновом режиме только в течение 3 минут.

да, вы правы до того, как iOS 7 iOS разрешила приложениям выполняться в фоновом режиме не более 10 минут, однако, начиная с iOS 7, они сократили это время до 180 секунд.

Но если вы хотите получать обновления местоположения в фоновом режиме, вы можете добавить свойство Required Background modes в свой файл info.Plist. Используя это, вы сможете запускать свое приложение в фоновом режиме для получения обновлений местоположения. Apple рассмотрит ваш запрос при рассмотрении вашего приложения для отправки в магазин приложений, поэтому обязательно используйте этот режим, только если вы используете его по прямому назначению.

введите здесь описание изображения

Ниже приведены различные режимы, в которых Apple разрешает выполнение в фоновом режиме. .html" rel="nofollow noreferrer">Документ Apple при выполнении в фоновом режиме

Фоновые наземные режимы

Изменить

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

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self performSelector:@selector(stopGettingLocationUPdates) withObject:nil   afterDelay:1800];
}

-(void)stopGettingLocationUPdates{
    [self.locationManager stopUpdatingLocation]
}

Это остановит обновления через 30 минут.

person Bhumit Mehta    schedule 15.09.2014
comment
Привет Бхумит, и спасибо за ответ. Я уже добавил эту вещь в файл info.Plist, точно так, как вы упомянули, и мое приложение работает в фоновом режиме, как и предполагалось, и все хорошо. Меня беспокоит только то, что я хочу, чтобы приложение потенциально получало обновления максимум 30 min, или пока пользователь не закончит его. 3 минуты мало. Может ли решение заключаться в том, чтобы приложение не переходило в фоновый режим? (если это возможно) - person Anders; 16.09.2014
comment
Вы можете программно прекратить получать обновления местоположения после того, как закончите использовать обновления, используя метод stopUpdatingLocation. - person Bhumit Mehta; 16.09.2014
comment
Предотвратить переход приложения в фоновый режим невозможно, но если вы используете один из фоновых режимов, вы можете получать обновления местоположения столько, сколько хотите, вы не будете ограничены 180 секундами, если используете этот фоновый режим. Вы можете остановить его, как только закончите. - person Bhumit Mehta; 16.09.2014
comment
В некоторых сценариях может случиться так, что iOS прервет ваше приложение, чтобы освободить часть памяти, если запущено слишком много приложений, в противном случае ваши приложения будут продолжать работать, пока пользователь не закроет их вручную. - person Bhumit Mehta; 16.09.2014
comment
Хорошо, я проверил это, и, как вы сказали, я могу бесконечно получать обновления местоположения в фоновом режиме. Но что, если пользователь никогда не отменит обновления? Приложение может продолжать разряжать батарею, и пользователь не будет знать, почему... - person Anders; 16.09.2014
comment
Да, вы правы, вы можете перестать получать обновления местоположения, как только закончите получать обновления. Однако, если вы программно не вызываете stopUpdatingLocation или пользователь не закрывает приложение, другого способа прекратить получение обновлений нет. - person Bhumit Mehta; 16.09.2014
comment
Я попытаюсь реализовать статический NSTimer и использовать его, чтобы обновления местоположения длились не более 30 минут. Спасибо за уделенное время :) - person Anders; 16.09.2014

Ваш код не работает в фоновом режиме. Это не тестирование того, что вы хотите проверить.

В документах говорится:

Выполнение задачи конечной продолжительности в фоновом режиме Приложениям, которые переходят в фоновый режим, может потребоваться дополнительное время для завершения любых важных задач в последнюю минуту. Чтобы запросить время выполнения в фоновом режиме, вызовите метод beginBackgroundTaskWithName:expirationHandler: класса UIApplication.

Фактическое время, которое вы получаете, не указано и, вероятно, определяется на основе энергопотребления, потребности в памяти и так далее. Они могут быть максимальными.

Они продолжают говорить:

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

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