11

问题: 我想在应用程序进入后台 5 秒后运行一个简单的函数。

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

我按要求添加了背景模式(BLE 附件被勾选,因为我们在这个函数中执行了一个小的 BLE 操作):

在此处输入图像描述

然后,我根据文档准备了 Info.plist (Identifier is fake just for StackOverflow question):

在此处输入图像描述

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")
            }
        } 

这里的问题是它非常不一致。苹果保证任务不会在给定日期之前执行,但不保证它会在准确的时间执行(我没问题,有一点延迟)。但是,当我运行应用程序时,它没有 100% 工作,无论我是否为任务请求提供了延迟(使用 earlyBeginDate)所以它曾经先尝试 7 秒(而不是 5 秒),下次我提交任务耗时26秒,第三次未到关门。

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

4

1 回答 1

9

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

于 2019-12-24T08:07:13.037 回答