2016-01-04 1 views
4

У меня есть приложение, которое запускает таймер, и таймер должен продолжать работать, даже если приложение завершает работу или телефон выключен. Итак, я пытаюсь это сделать, используя shouldSaveApplicationState и shouldRestoreApplicationState. Я добавил оба метода и willFinishLaunchingWithOptions к моему appDelegate, и я установил идентификаторы восстановления для каждого контроллера вида, контроллера навигации и контроллера панели вкладок. Тогда на контроллере представления, я хочу, чтобы восстановить я сделал это:Состояние восстановления работает только при подключении к Xcode

override func encodeRestorableStateWithCoder(coder: NSCoder) { 
    coder.encodeObject(startDate, forKey: "startDate") 
    coder.encodeObject(startTime, forKey: "startTime") 
    coder.encodeObject(elapsedTime, forKey: "elapsedTime") 
    coder.encodeObject(playing, forKey: "playing") 
    coder.encodeObject(timerLabel.text, forKey: "timerLabelText") 
    super.encodeRestorableStateWithCoder(coder) 
} 

override func decodeRestorableStateWithCoder(coder: NSCoder) { 
    startDate = coder.decodeObjectForKey("startDate") as! NSDate 
    startTime = coder.decodeObjectForKey("startTime") as! NSTimeInterval 
    elapsedTime = coder.decodeObjectForKey("elapsedTime") as! NSTimeInterval 
    playing = coder.decodeObjectForKey("playing") as! Bool 
    timerLabel.text = (coder.decodeObjectForKey("timerLabelText") as! String) 
    super.decodeRestorableStateWithCoder(coder) 
} 

override func applicationFinishedRestoringState() { 
    if playing { 
     elapsedTime += startDate.timeIntervalSinceNow 
     play() 
    } 
} 

Теперь вот странная часть. Когда мой телефон подключен к Xcode, и я использую кнопки воспроизведения и остановки Xcode для запуска и выхода из приложения, все работает так, как должно. Когда я пытаюсь сделать то же самое с телефоном, отключенным от Xcode, это похоже на то, что я даже не настроил восстановление состояния, приложение полностью игнорирует его и просто показывает первый контроллер представления. И я даже не могу отлаживать, потому что, когда я подключаю телефон к Xcode, он работает. То же самое происходит и с симулятором. Если я использую кнопки Xcode, восстановление работает. Если я просто открываю и закрываю приложение из самого симулятора, это не так.

Любые идеи?

ответ

4

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

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

Но если пользователь явно убивает приложение, это означает, что они не ожидают это будет «по-прежнему работает, так как они оставили его».

Источника: This part of Apple's docs гласит:

  • Система автоматически удаляет сохраненное состояние приложения, когда сила пользователя завершает работу приложения. Удаление сохраненной информации о состоянии , когда приложение убито, является мерой предосторожности. (В случае безопасности система также удаляет сохраненное состояние, если приложение во время запуска отключает ). Если вы хотите проверить работоспособность вашего приложения на , восстановите его состояние, вы не должны использовать панель многозадачности, чтобы убить приложение во время отладки. Вместо этого используйте Xcode, чтобы убить приложение или программно убить приложение , установив временную команду или жест до вызывать вызов по требованию.

Убийство приложение из Xcode («Стоп») повторяет «не инициированной пользователем завершение», следовательно, он уважает состояние потока сохранения/восстановления.

+0

Ах! Дурак я. Я часами читал о государственной реставрации, пытаясь понять это, и никто никогда не упоминал об этом. Но это имеет смысл. Вместо того, чтобы убивать приложение, я попытался перезапустить телефон, и все работает так, как должно. Благодаря! Но теперь мне нужно найти другой способ, чтобы таймер работал, если пользователь убил приложение. Какие-либо предложения? – dbmrq

+0

Вы хотите, чтобы таймер работал, даже если ваше приложение завершено?Единственное, что приходит на ум, - это сохранить текущую дату (сгенерированную с помощью NSDate() ') через регулярные промежутки времени, а когда приложение перезагрузится, прочитайте это значение и вычислите и вычислите прошедшее время, чтобы как-то« взять на себя где вы ушли «...? –

+0

Да, и мне также нужно будет показать правильный контроллер. Хорошо, я попытаюсь понять это, если не могу, я отправлю еще один вопрос. Спасибо за помощь! – dbmrq