Bar*_*lka 9 ios swift background-task taskscheduler ios-background-mode
问题: 我想在应用程序进入后台 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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当应用程序运行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")
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是它非常不一致。Apple 保证在给定日期之前不会执行任务,但不保证它会在准确的时间执行(我没问题,有一点延迟)。但是,当我运行该应用程序时,它并没有 100% 地工作,无论我是否提供了任务请求延迟(使用earestBeginDate),所以它曾经先尝试 7 秒(而不是 5 秒),下次我提交时任务花了26秒,第三次从未到达关闭。
我是否以错误的方式实施 BackgroundTask?我在互联网上搜索了一些答案,但没有遇到任何人遇到这个问题。
正如badhanganesh所说,似乎只有在系统决定这样做时才会执行任务。Apple 表示,在WWWDC 2019期间,会话 #707。
| 归档时间: |
|
| 查看次数: |
7152 次 |
| 最近记录: |