通过有限长度任务确定应用终止

时间:2019-04-22 13:53:48

标签: ios swift background

为了确定应用程序是否终止,我已经执行了有限长度的任务,但是一段时间后,应用程序被终止并从开始屏幕启动。

func registerBackgroundTask() {
    backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
        self?.endBackgroundTask()
    }
    assert(backgroundTask != .invalid)
}


func endBackgroundTask() {
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = .invalid
    if backgroundTask != .invalid {
        endBackgroundTask()
    }
}

 func applicationDidEnterBackground(_ application: UIApplication) {
    registerBackgroundTask()
}

在执行“有限长度”任务时,不应终止应用程序,请提供示例以标识处于挂起模式时终止应用程序的情况。

1 个答案:

答案 0 :(得分:1)

  

在执行有限长度任务时不应终止应用

根本没有保证。您的应用可能会被终止的原因很多。 beginBackgroundTask是对OS的更多时间请求,以完成对用户的短期运行操作。它不保证您的请求将被批准。

您执行此操作的特定方式可能偶尔会失败,并且在文档中有专门说明:

  

在开始任务之前,最好在应用程序实际进入后台之前,尽早调用此方法。该方法异步请求您的应用程序的任务断言。如果您在即将暂停应用程序之前调用此方法,则系统可能会在授予该任务断言之前挂起您的应用程序。例如,不要在applicationDidEnterBackground(_ :)方法的末尾调用此方法,并希望您的应用程序继续运行。如果系统无法授予任务断言,它将调用您的到期处理程序。

您要包装要请求时间的特定操作。无论您是否认为自己已进入后台,都必须包装该操作。您不仅会在每次进入后台时都调用它。

  

请提供示例,以识别应用程序处于挂起模式时的终止情况。

applicationWillEnterBackground中将一个值写入UserDefaults。在applicationDidEnterForeground中,删除密钥。在applicationWillFinishLaunching中,查找该密钥。如果在那里,那么您将被重新启动,因此有时您在后台死亡。其中包括重启或电源故障。如果不存在,那么这是第一次启动,或者您在前台崩溃了。实施此操作的确切方法高度取决于您打算如何处理这些信息。