iOS 13 - 不能一直使用 BGTaskScheduler

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?我在互联网上搜索了一些答案,但没有遇到任何人遇到这个问题。

Bar*_*lka 6

正如badhanganesh所说,似乎只有在系统决定这样做时才会执行任务。Apple 表示,在WWWDC 2019期间,会话 #707

  • @mykolaj,我相信可能有某种方法可以做到这一点,这可能就是人们投票否决的原因。由于产品定义发生了变化,我不再致力于它,而且我没有时间花精力去解决它。 (2认同)
  • 不,我认为人们之所以投反对票是因为他们知道这件事。你是 100% 正确的,系统会做出决定。BGTaskSchedular 中没有其他方法可以做到这一点 (2认同)