问题:我想运行一个简单的函数,在应用程序进入后台5秒钟后。
我必须实现BGTaskScheduler,以支持iOS 13。旧的BackgroundTask实现适用于旧的iOS版本。
我按要求添加了背景模式(因为我们在这个函数中执行了一个小的BLE操作,所以会勾选BLE附件):

然后,我根据文档编写了Info.plist (标识符是假的,仅用于StackOverflow问题):

在didFinishLaunchingWithOptions结束之前,我注册我的BackgroundTask:
if #available(iOS 13.0, *) {
BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.MyID", using: .global()) { (task) in
print("My backgroundTask is executed NOW!")
task.expirationHandler = {
task.setTaskCompleted(success: true)
}
}
}现在,当应用程序运行didEnterBackground方法时,我提交了一个BackgroundTaskRequest:
if #available(iOS 13.0, *) {
do {
let request = BGAppRefreshTaskRequest(identifier: "com.example.MyID")
request.earliestBeginDate = Calendar.current.date(byAdding: .second, value: 5, to: Date())
try BGTaskScheduler.shared.submit(request)
print("Submitted task request")
} catch {
print("Failed to submit BGTask")
}
} 这里的问题是它是非常不一致的。Apple保证该任务不会在给定日期之前执行,但并不保证它将在确切的时间内执行(我很好,稍微延迟一下)。然而,当我运行这个应用程序时,它不能工作100%的时间,不管我是否提供了任务请求的延迟(使用earliestBeginDate),所以它过去是第一次尝试7秒(而不是5秒),下一次我提交任务花了26秒,第三次从未到达关闭。
我是不是以错误的方式实现了BackgroundTask?我在网上搜索了一些答案,但没有遇到任何有这个问题的人。
发布于 2019-12-24 08:07:13
正如badhanganesh所说,似乎只有当系统决定这样做时,才会执行任务。苹果在WWWDC 2019,会议#707期间就这么说了。
https://stackoverflow.com/questions/59454989
复制相似问题