Почему NSTimer можно отложить в фоновом режиме?

Мое приложение работает в фоновом режиме и использует NSTimer для запуска аудио через определенное время. У меня и моих тестеров нет проблем с этим, и аудио может быть запущено через несколько часов в фоновом режиме (>10 часов).

Моя проблема в том, что некоторые пользователи сообщают, что звук часто задерживается, иногда на несколько минут, иногда на час.

Я делаю что-то подобное:

UIApplication * app = [UIApplication sharedApplication];
  bgTask = [app beginBackgroundTaskWithExpirationHandler:nil];

dispatch_async(dispatch_get_main_queue(), ^{
    theTimer = [NSTimer scheduledTimerWithTimeInterval:[theDateIWant timeIntervalSinceNow] target:self selector:@selector(playAudio) userInfo:nil repeats:NO];
    });

Мои вопросы:

-Не может ли система NSTimer задержать систему? если так, как обойти эту проблему? -Как воспроизвести подобные проблемы? - Безопаснее ли использовать следующее?

theTimer = [[NSTimer alloc] initWithFireDate:theDateIWant interval:0.0 target:self selector:@selector(playAudio) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:theTimer
                          forMode:NSDefaultRunLoopMode];

Спасибо за любую помощь!

1 ответ

Мне кажется, что вы немного неправильно понимаете фоновые задачи.

Когда выполняется первый фрагмент (я предполагаю, что вы помещаете его в applicationDidEnterBackground метод), говорит система

У меня есть небольшая задача, пожалуйста, подождите немного, пока я ее не закончу!

и система будет ждать около 5-10 минут, прежде чем приостановить приложение.

Если вам нужен вид будильника, вы можете использовать LocalNotification для воспроизведения определенного звука в указанное время.

Другие вопросы по тегам