状态恢复只有在连接到Xcode时才起作用

我有一个运行计时器的应用程序,即使应用程序退出或closures手机,计时器仍应继续运行。 所以我试图做到这一点,使用shouldSaveApplicationStateshouldRestoreApplicationState 。 我添加了方法和willFinishLaunchingWithOptions到我的willFinishLaunchingWithOptions ,并为每个视图控制器,导航控制器和标签栏控制器设置了恢复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的播放和停止button来启动,并退出应用程序一切正常,因为它应该。 然而,当我用与Xcode断开连接的电话尝试同样的事情时,就像我甚至没有设置状态恢复,应用程序完全忽略它,只显示第一个视图控制器。 而且我甚至不能进行debugging,因为当我将手机连接到Xcode的时候, 同样的事情发生在模拟器上。 如果我使用Xcode的button恢复工作。 如果我只是从模拟器本身打开和closures应用程序,它不会。

有任何想法吗?

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

理由( 下面是我自己的推测/解释 )是,状态恢复的全部目的是让用户在上次离开应用程序时回到应用程序,就好像从未终止(从用户的angular度看法)。

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

资料来源: 苹果公司的这部分文档指出:

  • 当用户强制退出应用程序时,系统会自动删除应用程序的保留状态。 当应用程序被终止时删除保存的状态信息是安全的预防措施。 (为了安全起见,如果应用程序在启动期间崩溃了两次,系统也会删除保留状态。)如果您想testing应用程序恢复其状态的能力,则不应在debugging过程中使用多任务栏来终止应用程序。 相反,使用Xcode杀死应用程序或通过安装临时命令或手势来按需要调用退出来以编程方式closures应用程序。

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