Запуск таймера в фоновом режиме - PullRequest
2 голосов
/ 14 января 2020

Я пишу приложение в Swift, где таймер обратного отсчета, как часы с обратным отсчетом. Для этого я использую этот код в своем основном классе логики:

func start() {
    self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
        self.run()
    }
}

Теперь каждый раз, когда я закрываю приложение, таймер останавливается, и я получаю эту ошибку:

BackgroundTask : не существует фоновой задачи с идентификатором 1 (0x1), или она может быть уже завершена.

Есть ли способ продолжить работу таймера в фоновом режиме? Или у вас есть какой-нибудь другой, возможно, более элегантный способ решить мою проблему? Я искал весь стекопоток в течение нескольких часов, но, похоже, не могу найти ответ.

1 Ответ

1 голос
/ 14 января 2020

Apple не позволит вам запускать процессы в течение длительных периодов времени после того, как приложение было установлено в фоновом режиме. Из документов:

Реализация долгосрочных задач

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

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

Объявление сервисов позволяет системе узнать, какими сервисами вы пользуетесь, но в некоторых случаях именно системные каркасы фактически препятствуют приостановке вашего приложения.

При этом С другой стороны, если вы действительно пытаетесь обновить «часы обратного отсчета», я бы просто сохранял текущее системное время (возможно, в UserDefaults) во время фонового приложения. Затем, когда приложение вернется на передний план, сравните сохраненное время с текущим временем и выполните необходимые вычисления, чтобы определить время, которое должны отображать ваши часы.

...