【发布时间】:2020-04-23 21:33:23
【问题描述】:
尝试在 iOS 13+ 中使用 BackgroundTasks。长时间运行的操作似乎不起作用:
// in AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
BGTaskScheduler.shared.register(forTaskWithIdentifier: "foo.bar.name", using: nil) { task in
print("start!")
task.expirationHandler = {
// Not executed
print("expired!")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
// Not executed
print("finish!")
task.setTaskCompleted(success: true)
}
}
return true
}
func applicationDidEnterBackground(_ application: UIApplication) {
BGTaskScheduler.shared.cancelAllTaskRequests()
let request = BGProcessingTaskRequest(identifier: "foo.bar.name")
request.earliestBeginDate = nil // or Date(timeIntervalSinceNow: 0) or Date(timeIntervalSinceNow: 5)...
do {
try BGTaskScheduler.shared.submit(request)
} catch let e {
print("Couldn't submit task: \(e)")
}
}
我还尝试使用带有Operation 的队列(为此我同步建模了我的流程)。这也没有奏效。一旦有事情需要一段时间才能完成,它就会卡住。
它不会将任何其他内容记录到控制台,没有错误,也没有过期的任务消息。它显示了长时间运行操作之前的最后一条消息,仅此而已。我通过存储首选项并在重新启动时检查它来确认它不会继续前进。它没有被存储。
我将“foo.bar.name”添加到 info.plist(在“允许的后台任务调度程序标识符”中)并启用了后台获取和后台处理的功能。我正在使用 iOS 13.3.1 并使用 Xcode 11.4.1 的 iPhone 上进行测试。
补充说明:
我已按照此处所述立即开始执行任务:https://developer.apple.com/documentation/backgroundtasks/starting_and_terminating_tasks_during_development
我还使用 Apple 的 demo project 进行了测试。显示同样的问题:数据库清理操作未完成(我在
cleanDatabaseOperation.completionBlock开头添加了一个日志,它从未显示)。
【问题讨论】: