iOS 13-一直无法使用BGTaskScheduler

时间:2019-12-23 11:58:38

标签: ios swift taskscheduler background-task ios-background-mode

问题: 我想在应用进入后台5秒后运行一个简单的功能。

我必须实现BGTaskScheduler才能支持iOS 13。 BackgroundTask的旧实现适用于我的旧iOS版本。

我根据要求添加了背景模式(由于我们在此功能中执行了一个小的BLE操作,因此选中了BLE配件):

enter image description here

然后,我根据文档(标识符为假仅用于StackOverflow问题)准备了Info.plist:

enter image description here

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保证不会在给定日期之前执行任务,但不能保证将在确切的时间执行任务(我很好,但有一点延迟)。 但是,当我运行该应用程序时,无论我是否提供了任务请求延迟(使用earlyestBeginDate),它都无法100%地运行,因此它下次通常要先尝试7秒(而不是5秒),下次我提交任务耗时26秒,第三次从未到达关闭。

我是否以错误的方式实现BackgroundTask?我在互联网上搜索了一些答案,但没有遇到任何遇到此问题的人。

1 个答案:

答案 0 :(得分:-1)

正如badhanganesh所说,似乎只有在系统决定执行任务时才会执行任务。 苹果在WWWDC 2019, session #707期间表示。