我有一个运行计时器的应用程序,即使该应用程序退出或手机已关闭,计时器也应保持运行。所以我正在尝试使用shouldSaveApplicationState
和shouldRestoreApplicationState
。我将这两种方法都添加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的按钮,则恢复正常。如果我只是从模拟器本身打开和关闭应用程序,则不会。
有任何想法吗?
当用户从多任务菜单主动“杀死”您的应用程序时,状态恢复将不起作用。仅当系统在后台静默杀死您的应用以回收资源(例如,内存)时,它才起作用。
理由(以下是我自己的推测/解释)是,状态恢复的全部目的是让用户在上次离开应用程序时返回到该应用程序,仿佛它从未被终止(从用户的角度出发)观点)。
但是,如果用户明确杀死该应用程序,则意味着他们不希望它“在离开时仍在运行”。
资料来源: Apple的这部分文档指出:
当用户强行退出应用程序时,系统会自动删除该应用程序的保留状态。安全关闭后,删除应用程序时删除保留的状态信息。(为安全起见,如果应用在启动过程中两次崩溃,系统也会删除保留的状态。)如果要测试应用恢复状态的能力,则不应在调试过程中使用多任务栏杀死应用。而是使用Xcode杀死应用程序,或通过安装临时命令或手势以按需调用exit的方式以编程方式终止应用程序。
从Xcode杀死应用程序(“停止按钮”)将复制“非用户启动的终止”,因此它遵守状态保存/恢复流程。