我在appDelegate的didFinishLaunchingWithOptions中注册了后台获取任务:
BGTaskScheduler.shared.register(forTaskWithIdentifier: BackgroundScheduler.shared.backgroundTaskId, using: DispatchQueue.main) { task in
BackgroundScheduler.shared.handleAppRefresh(task: task as! BGAppRefreshTask)
}handleAppRefersh函数调度另一个刷新任务,并调用该操作的fetch方法,还传递一个完成处理程序,以便在完成fetch操作后运行。
func handleAppRefresh(task: BGAppRefreshTask) {
os_log("handleAppRefresh exetued.")
scheduleAppRefresh()
task.expirationHandler = {
os_log("backgroundFetch expiration called")
}
operation.fetch() {
os_log("backgroundFetch fetch called")
task.setTaskCompleted(success: true)
}
}scheduleAppRefresh提交BGAppRefreshTAskRequest以重复后台fetch执行。
func scheduleAppRefresh() {
os_log("scheduleAppRefresh exetued.")
let request = BGAppRefreshTaskRequest(identifier: backgroundFetchId)
request.earliestBeginDate = Date(timeIntervalSinceNow: AppSettings.refreshInterval)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
os_log("Could not schedule app refresh:", error.localizedDescription)
}
}refreshInterval为10 * 60,即10分钟。
operation.fetch方法检查设备的当前位置并向远程服务器发送请求。最后,它发送本地通知,更新UI并调用以下代码:
task.setTaskCompleted(success: true)在Xcode中检查“位置更新”和“后台获取”功能,并将所需的设置添加到info.plist中。
当我使用下面的debug命令测试后台抓取功能时,一切工作正常,调试器中没有任何警告消息。
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"]但是,当我将应用程序放在后台很长时间时,iOS永远不会调用handleAppRefresh函数。
Xcode: 12.2,iOS: 14.2
项目公共存储库:https://github.com/amirrezaeghtedari/CoronaVirousRegulations.git
我完全糊涂了。
发布于 2020-11-26 03:46:33
我将后台获取间隔设置为10分钟,在等待了大约4个小时或更长时间后,iOS在后台运行我的应用程序。在那之后,我的应用程序会不定期地在后台被调用,时间间隔从不到一个小时到几个小时。很明显,我的实现没有问题,这些执行间隔取决于iOS策略。
发布于 2020-11-16 11:57:24
WWDC 2020 Background execution demystified
据称,有许多因素在起作用,这些因素决定了你的应用程序何时实际运行后台刷新。操作系统的神经引擎会在用户启动应用程序时学习,以便在更新之前执行更新。他们在2019年的会议上首次提到了这一点。
https://stackoverflow.com/questions/64844812
复制相似问题