状态恢复仅在连接到Xcode时有效

时间:2016-01-04 06:59:18

标签: ios xcode swift state-restoration

我有一个运行计时器的应用程序,即使应用程序退出或手机关闭,计时器也应继续运行。 所以我尝试使用shouldSaveApplicationStateshouldRestoreApplicationState来做到这一点。我将两种方法和willFinishLaunchingWithOptions添加到我的appDelegate中,并为每个视图控制器,导航控制器和标签栏控制器设置了恢复ID。 然后在视图控制器上我要恢复我做了这个:

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的按钮,修复工作。如果我只是从模拟器本身打开和关闭应用程序,它就不会。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

当用户从多任务菜单中主动“杀死”您的应用时,状态恢复不起作用。它仅在系统在后台静默杀死您的应用程序以回收资源(例如,内存)时才有效。

理由(以下是我自己的猜测/解释)将是,状态恢复的整个目的是让用户在他们上次离开时​​回到应用程序,如如果它从未被终止(从用户的角度来看)。

但如果用户明确杀死了应用,则意味着他们不希望它仍然“正在运行,因为他们离开了它”。

<强>来源: This part of Apple's docs声明:

  
      
  • 当用户强制退出应用程序时,系统会自动删除应用程序的保留状态。删除保留的状态信息   当应用程序被杀是一个安全预防措施。 (作为安全   预防措施,如果应用程序崩溃,系统也会删除保留状态   在发布期间两次。)如果您想测试您的应用程序的能力   恢复它的状态,你不应该使用多任务栏来杀死它   调试期间的app。相反,使用Xcode杀死应用程序或杀死应用程序   通过安装临时命令或手势以编程方式应用程序   按需退出。
  •   

从Xcode杀死应用程序(“停止按钮”)复制“非用户启动的终止”,因此它尊重状态保存/恢复流程。