4

我有一个运行计时器的应用程序,即使应用程序退出或手机关闭,计时器也应该继续运行。所以我正在尝试使用shouldSaveApplicationStateand来做到这一点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 的按钮恢复工作。如果我只是从模拟器本身打开和关闭应用程序,它不会。

有任何想法吗?

4

1 回答 1

5

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

理由(以下是我自己的推测/解释)是,状态恢复的全部目的是让用户回到他们上次离开的应用程序,就好像它从未被终止(从用户的角度来看)观点)。

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

资料来源: Apple 文档的这一部分指出:

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

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

于 2016-01-04T07:07:06.667 回答