首页 > 解决方案 > 通过有限长度任务识别应用程序终止

问题描述

为了识别应用程序终止,我已经实现了有限长度任务,但在一段时间后应用程序被终止并从开始屏幕启动。

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()
}

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

标签: iosswiftbackground

解决方案


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

这根本没有承诺。您的应用程序可能被终止的原因有很多。beginBackgroundTask是向操作系统请求更多时间来完成为用户执行短期运行的操作。它不保证您的请求会被批准。

您执行此操作的具体方式可能偶尔会失败,并在文档中专门解决:

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

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

请提供示例以识别应用程序在挂起模式下的终止。

applicationWillEnterBackground将值写入UserDefaults. 在applicationDidEnterForeground中,删除密钥。在applicationWillFinishLaunching中,寻找那把钥匙。如果它在那里,那么你将被重新启动,所以在某些时候你死在后台。这包括重启或电源故障等。如果它不存在,那么这是第一次启动,或者您在前台坠毁。实现这一点的精确方法很大程度上取决于您打算如何处理这些信息。


推荐阅读