2017-02-18 3 views
2

Я пытаюсь сделать приложение, которое может сделать запуск таймера в фоновом режиме.Swift 3 - Как заставить таймер работать в фоновом режиме

вот мой код:

let taskManager = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(self.scheduleNotification), userInfo: nil, repeats: true) 
     RunLoop.main.add(taskManager, forMode: RunLoopMode.commonModes) 

выше код будет выполнять функцию, которая будет вызывать локальное оповещение. Это работает, когда приложение находится на переднем плане, как я могу заставить его работать в фоновом режиме?

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

Я хотел, чтобы таймер все еще работал в фоновом режиме. есть ли способ сделать это?

вот что я хочу, чтобы это произошло:

приложение запуска -> подождите 10 секунд -> извещение получено -> подождите 10 секунд -> извещение получено -> и обратно ждать и снова получил

, что происходит когда на переднем плане. но не в фоновом режиме. PLS помощи.

ответ

2

Таймер может работать в фоновом режиме, только если оба следующие условия:

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

  • Таймер запускался уже после того, как приложение отправилось в фон.

+0

Не можете ли вы запустить таймер в фоновом режиме, обернув его в backgroundTask? Хотя тогда это будет в конечном итоге убито его истечениемHandler (3 минуты)? – Honey

+0

По моему опыту, «NSTimer» перестанет работать, когда приложение зайдет в фон, если приложение не запустило какой-либо фоновый режим. Но когда приложение вернется на передний план, таймер может продолжать работать, но временной интервал в фоновом режиме будет отсутствовать. –

0

Как указывалось другим, Таймер не может запустить метод в фоновом режиме. Вместо этого вы можете использовать while while внутри задачи async

DispatchQueue.global(qos: .background).async { 
       while (shouldCallMethod) { 
        self.callMethod() 
        sleep(1) 
       } 
} 
+0

Отличное решение! –

 Смежные вопросы

  • Нет связанных вопросов^_^