【发布时间】:2018-01-30 22:59:48
【问题描述】:
我想阻止 iOS 在几分钟后杀死我的应用。 我在这里读过这个帖子:Prevent iOS from killing my app after 3 minutes。它说如果我没有超过 3 分钟的后台任务,我的应用程序不会被杀死。有人可以验证这是真的吗?因为我的后台任务运行时间不超过 3 分钟,即使我的应用程序在此时间后被杀死。 我的后台任务是一个更新小部件的计时器。下面是一些代码:
self.backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
self?.endBackgroundTask()
//endBackGroundTask looks like this
UIApplication.shared.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskInvalid
//
}
self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(self.updateTimer)), userInfo: nil, repeats: true)
.
// at the beginning of the class
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
.
// in viewWillDisappear
self.timer.invalidate()
if self.backgroundTask != UIBackgroundTaskInvalid {
self.endBackgroundTask()
}
【问题讨论】:
-
你不能在后台无限期地运行定时器; 3 分钟后,您的应用将因超过后台时间而终止。当您的应用不在前台时,应该不需要持续更新任何内容。这对电池使用效率不高。
-
也许您应该澄清“后台任务”的含义,因为您引用了
viewWillDisappear;如果您的真正意思是在您的应用程序处于活动状态时运行计时器以定期更新您的 UI,那么这不是后台任务,您不需要使用beginBackgroundTask;如果您想在您的应用程序通常被暂停时执行工作(即用户按下主页按钮移动到另一个应用程序),您只需要使用此选项。如果您只想在应用程序处于前台时计时,只需删除所有后台任务内容即可。 -
计时器从字面上倒计时并根据应用状态是 .active 还是 .background 更新当前视图或相应的小部件。
-
对,所以这类事情的标准方法是在您的应用程序处于活动状态时使用计时器,然后当它移动到后台时,您保存时间戳。当您的应用返回前台时,您可以计算经过的时间并更新您的 UI。您甚至可以在应用进入后台时安排本地通知,以便在适当的时间显示通知。
-
但是我将无法在我的小部件中显示滴答秒数,这是我想保留的应用程序的一个非常有用的功能。
标签: ios swift background background-task