【问题标题】:State restoration only works when connected to Xcode状态恢复仅在连接到 Xcode 时有效
【发布时间】:2016-04-07 18:27:20
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: ios xcode swift state-restoration


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 啊!傻我。我花了几个小时阅读有关状态恢复的文章试图弄清楚这一点,但没有人提到过。但这确实是有道理的。我没有杀死应用程序,而是尝试重新启动手机,一切正常。谢谢!但是现在,如果用户终止应用程序,我将不得不找到另一种方法来保持计时器运行。有什么建议吗?
    • 即使您的应用程序终止,您也想保持计时器运行?唯一想到的是定期保存当前日期(使用NSDate() 生成),当应用程序重新启动时,读取该值并计算并计算经过的时间,以某种方式“从你的位置接管离开”...?
    • 是的,我还必须显示正确的视图控制器。好吧,我会试着弄清楚,如果我不能,我会在这里发布另一个问题。感谢您的帮助!
    • 我认为最好的办法是:每当您的计时器启动时,计算当前的 Unix 时间戳(使用 NSDate),并将其保存到磁盘(例如,使用 NSUserDefaults)。当您需要恢复计时器时,读取该值并计算自计时器第一次启动以来经过的毫秒数,以及现在(再次使用NSDate())。然后,在这几毫秒内给它一个领先的开始(而不是从 00:00.000 开始)
    • 如果你去developer.apple.com/downloads(并登录),搜索“恢复”,你会发现一堆调试工具,包括可以安装在设备上以启用状态恢复的配置文件即使您直接杀死该应用程序。无需每次都重新启动。如果您正在寻找更多详细信息,您可能会对这个演示感兴趣:github.com/shagedorn/StateRestorationDemo。它包括代码,但也有很多幻灯片和解释,包括。调试提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多