iOS 9: beginBackgroundTaskWithExpirationHandler получает вызов до таймаута

Я работаю над вызовом VOIP и добавляю поддержку iOS <10. Для входящего вызова VOIP, когда приложение находится в фоновом режиме, я использую UILocalNotification (устарел в iOS 10).

Чтобы позвонить 60 секунд (или 1 минута), я использую этот код

count = 0; apnTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(showIncomingCall:) userInfo:userInfo repeats:YES]; self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"ALVOIP : BACKGROUND_HANDLER_NO_MORE_TASK_RUNNING."); [application endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; }]; -(void)showIncomingCall:(NSTimer *)timer { if (count < 60) { UIApplication *application = [UIApplication sharedApplication]; [application presentLocalNotificationNow:localNotification]; NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]); count = count + 3; return; } // TIMEOUT : STOP TIMER AND LOCAL NOTIFICATION BACKGROUND TASK [self invalidateCallNotifying]; } -(void)invalidateCallNotifying { [apnTimer invalidate]; if (self.backgroundTask != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; } } 

для продления времени фонового процесса до 1 минуты, и он работает в iOS 10.1.1 (iPhone), но не работает в iOS 9.3.5 (iPad). Как-то обработчик вызывает 30-33 секунды?

ОБНОВИТЬ:

Я попытался прокомментировать этот код:

 self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"ALVOIP : BACKGROUND_HANDLER_NO_MORE_TASK_RUNNING."); [application endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; }]; 

Тем не менее я могу делать 30-33 секунд, т.е. я не знаю, почему это не работает?

Я бы предложил вам ввести код в эту структуру и использовать этот код

 -(void)yourMethod { __block UIBackgroundTaskIdentifier background_task; background_task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){ [[UIApplication sharedApplication] endBackgroundTask: background_task]; background_task = UIBackgroundTaskInvalid; }]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Some Methods Calls dispatch_async(dispatch_get_main_queue(), ^{ //View Controller Change }); }); } 

Когда вы создаете приложение VOIP, в info.plist вы должны установить UIBackgroundModes для voip и UIApplicationExitsOnSuspend для NO чтобы разрешить фоновые задачи.

Ознакомьтесь с этой страницей справки на яблоне в разделе «Объявление поддерживаемых фоновых задач вашего приложения» для получения дополнительной информации.

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

Также см. Этот ответ на SO.

Вместо того, чтобы использовать NSTimer, я предлагаю вам запланировать несколько UILocalNotification, каждый из которых имеет увеличенный fireDate, а затем установите ваш UILocalNotification звук для увеличения интервала. Например, скажем, ваш звук может длиться 20 секунд, затем вы планируете 3 UILocalNotification с помощью fireDate через 0, + 20, + 40 секунд.

Конечно, если пользователь отвечает на ваш звонок, вам нужно отменить оставшееся UILocalNotification.

  • Максимальное несоответствие UILocalNotification
  • Может ли код запуска локального уведомления в iOS8?
  • Производительность с расписаниемLocalNotification (большое количество локальных уведомлений)
  • Как запустить задачу в режиме быстрой передачи в определенный момент времени в фоновом режиме, либо приложение включено, либо выключено
  • Звучит в UILocalNotification громче, чем AVAudioPlayer при максимальном объеме
  • Пользовательский интервал повторения для UILocalNotification
  • Пользовательское название для UILocalNotification
  • Местные уведомления срабатывают немедленно, а не когда они запланированы
  • Местное уведомление не отображается при попадании в область
  • Можно ли заставить дату устройства проверять локальные уведомления?
  • UILocalNotification - предупреждающий звук продолжает играть после открытия приложения
  • Давайте будем гением компьютера.