2015-08-06 3 views
0

Я делаю приложение, которое полагается на таймер, который срабатывает каждую минуту, чтобы изменить ярлык от «x минут осталось» до «(x-1) минут влево. В принципе, это уменьшает число каждую минуту. Мне нужен таймер для работы, даже когда я закрываю приложение (не полностью, просто нажмите на главный экран и оставьте его в фоновом режиме), так что когда пользователь вернется в приложение, оставив его в фоновом режиме для 5 минут, на этикетке будет указано «(x-5) минут осталось».Сохранение таймеров при запуске приложения

Прямо сейчас, когда я запускаю его в симуляторе, он работает отлично, но когда я запускаю его на своем телефоне, он не работает. приложение открыто на моем телефоне, оно работает, но если приложение работает в фоновом режиме, метка никогда не уменьшается. Может ли это быть связано с различиями в том, как Simulato r и фактическая многозадачность для iPhone? Если да, то как я могу изменить свой код, чтобы таймер все равно обновлял метку каждую минуту, чтобы отобразить правильный номер, когда пользователь снова открывает приложение?

Вот моя установка таймера:

var individualTaskTimer = NSTimer() 

func createTimerForTopTask(){ 
    individualTaskTimer = NSTimer.scheduledTimerWithTimeInterval(tasks[0].minutes * 60, target: self, selector: "deleteTopTask", userInfo: nil, repeats: true) 
} 
+0

Это не обязательно решение, но Оле Бегеманн писал на высоком уровне о том, как приложения будильника работают с многозадачностью на iOS. http://oleb.net/blog/2014/02/alarm-clock-apps-ios/ –

+0

Время работы iOS Simualtor между 8.0 и 11.0 Beta 2 не может приостанавливать приложения, когда они входят в фоновый режим. iOS 11.0 Beta 3 Simulator (входит в Xcode 9.0 Beta 3) решает эту проблему. Приложения, которые были созданы, должны быть надлежащим образом приостановлены для лучшего соответствия поведения устройства. –

ответ

2

Как уже упоминалось в ответе Эвана Меллора, вы не сможете рассчитывать на таймер, когда приложение находится в фоновом режиме. Поэтому вам нужно будет при необходимости настроить, когда ваше приложение вернется на передний план.

При первом чтении документации может показаться, что viewWillAppear и viewWillDisappear (или viewDidDisappear) являются правильными местами для обработки этого. Однако они не вызываются, когда приложение перемещается в/из фона.

Вместо этого вы можете использовать два уведомления, UIApplicationWillResignActiveNotification и UIApplicationDidBecomeActiveNotification. Первое уведомление будет отправлено в ваше приложение, когда оно собирается перейти в фоновый режим. Второе уведомление будет отправлено в ваше приложение, когда оно вот-вот вернется на передний план.

Так viewWillAppear вы можете зарегистрироваться для уведомлений следующим образом:

override func viewWillAppear(animated: Bool) { 
    // some other code 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "activeAgain", name: "UIApplicationDidBecomeActiveNotification", object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "goingAway", name: "UIApplicationWillResignActiveNotification", object: nil) 

} 

где activeAgain и goingAway две функции, которые вы написали для включения и выключения таймера. Так на основе фрагмента кода в вашем вопросе, они будут выглядеть примерно так:

func activeAgain() { 
    let newTime = // calculate how much time is left (in seconds) 
    individualTaskTimer = NSTimer.scheduledTimerWithTimeInterval(newTime, target: self, selector: "deleteTopTask", userInfo: nil, repeats: true) 

} 

func goingAway() { 
    individualTaskTimer.invalidate() 
} 

Обратите внимание, что вам нужно отменить для уведомлений при переходе от этой точки зрения. Выполнение этого в viewWillDisappear, вероятно, хорошее место.

2

Вы не можете это сделать. После короткого времени iOS приостанавливает ваше приложение, когда оно переходит в фоновый режим. Просто обновите свой ярлык с правильным временем, когда приложение вернется на передний план.

+0

правильный. Бывает – Myaaoonn