UIApplication.shared.beginBackgroundTask在iOS 13上不起作用。是否有其他选择可在iOS 13上实现长时间运行的后台任务?此外,它在iOS 12及以下版本上也能完美运行。
当应用进入后台状态时,它会在2分钟内终止,而我希望它在后台继续运行数小时,因为我们正在后台进行一些处理。
下面是我正在使用的代码,因此当我的应用程序在后台运行时,它可以节省额外的执行时间。我们需要额外的执行时间,因为我们会定期将当前位置发送到服务器。
/// Register background task. This method requests additional background execution time for the app
private func registerBackgroundTask() {
DispatchQueue.global().async {
self.backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "BgTask", expirationHandler: {
// Ends long-running background task
self.endBackgroundTask()
})
}
}
/// Ends long-running background task. Called when app comes to foreground from background
private func endBackgroundTask() {
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
答案 0 :(得分:1)
工作正常。根据定义,它应将应用程序的后台执行时间延长几分钟,以便您完成已经开始的任务,如果未正确完成,则可能对您的应用程序有害。过去是10分钟,现在是3分钟。实际上,根据我在网上找到的最新文章
,我认为它可以减少到30秒因此,这绝对不是满足您需求的正确工具。尝试研究URLSessionConfiguration.background(withIdentifier:)
,但要当心,因为它周围存在很多风险和错误。
另外,在Internet上搜索Dropbox的背景位置更新,以了解Dropbox如何克服背景限制。
祝你好运
答案 1 :(得分:0)
有关iOS 13中后台任务的一般法律意见,请参阅WWDC 2019 Advances in App Background Execution。但是简短的答案是,您不能仅使应用程序在后台无限期地运行。苹果这样做是为了确保应用不会耗尽用户的电量。
如果要“定期将当前位置发送到服务器”,建议您检出significant change location service或visits location service。使用这些服务,如果用户位置发生重大变化,操作系统可以唤醒您的应用。