我正在尝试添加一个后台任务到我的应用程序,一切似乎都在工作,注册和调度任务与以下代码注册。
static func registerTask() {
BGTaskScheduler.shared.register(forTaskWithIdentifier: taskIdentifier, using: nil) { task in
task.expirationHandler = {
task.setTaskCompleted(success: false)
}
// Do things here
task.setTaskCompleted(success: true)
}
}
和这个安排:
static func scheduleTask() {
let request = BGAppRefreshTaskRequest(identifier: taskIdentifier)
request.earliestBeginDate = .now.addingTimeInterval(30)
try? BGTaskScheduler.shared.submit(request)
}
问题是,在我的日程安排功能运行后,应用程序进入后台,我得到以下类型的错误:
[BackgroundTask]后台任务61 ("CoreData: CloudKit Import"),创建时间超过30秒。在后台运行的应用程序中,这会产生终止的风险。请记住及时为您的任务调用UIApplication.endBackgroundTask(_:)以避免这种情况。
[tcp] tcp_output [C1.1.1.1:3] flags=[R. 3]seq=1263069135, ack=3409229275, win=2046 state=CLOSED, rcv_nxt=3409229275, snd_una=12630690582023-04-06 17:58:23.217898-0700 MyApp[14099:4978381] [error] error: Unexpected background task assertion cancel .
[BackgroundTask]后台任务在过期处理程序被调用后仍未结束:<<em>UIBackgroundTaskInfo: 0x2805ac580>: taskID = 61, taskName = CoreData: CloudKit Import, createtime = 508235 (elapsed = 76)。这个应用程序可能会被系统终止。调用UIApplication.endBackgroundTask(:)来避免这种情况。
我不明白为什么会发生这种情况,因为我的后台任务与应用程序中的任何CoreData或CloudKit无关,我用它来创建通知。
用Xcode标志手动触发任务工作正常,但似乎每次后台任务都试图自己启动,它与CloudKit有某种问题。
这也是我唯一的后台任务,同样,与CoreData或Cloudkit无关。
有没有其他人遇到类似的事情,或者如果你使用CloudKit和后台任务,它是否工作得很好?
谢谢。
此错误与您的代码无关。
被终止的后台任务是CoreData &CloudKit同步,在您的情况下,从iCloud导入应该与CoreData持久存储同步。
我在手表上见过这种错误,它当然比iPhone慢得多。
只要你的应用没有真正终止,你就应该忘记这个警告。如果它被终止了,我敢建议写一个bug报告(我的几乎从来没有被处理或回答过…)。