Это потому, что вы не позвонили BGTaskScheduler.shared.register
в didFinishLaunchingWithOptions
.
if ( !BGTaskScheduler.shared.register(forTaskWithIdentifier: BackupTask.identifier,
using: nil) { task in
BackupTask.handleProcess(task as? BGProcessingTask)
} ){
logHelper.w("BackupTask register failed.")
}
И поместили это в applicationDidEnterBackground
.
if #available(iOS 13.0, *) {
BackupTask.scheduleProcessing()
}
Вот что scheduleProcessing
выглядит так.
@available(iOS 13, *)
static func scheduleProcessing() {
let logHelper = LogHelper(subsystem: "TimeMachineTask", category: "scheduleProcessing")
let request = BGAppRefreshTaskRequest(identifier: TimeMachineTask.identifier)
// Fetch no earlier than 5 minutes from now
request.earliestBeginDate = Date(timeIntervalSinceNow: 60 * 15)
do {
try BGTaskScheduler.shared.submit(request)
logHelper.i("Submit new request.")
} catch {
logHelper.e("Could not schedule app refresh: %@", error: error)
}
}
BGTaskScheduler.shared.register
сообщает iOS, что делать после запуска фоновой задачи, которая является «обработчиком запуска», который вам не хватает. BackupTask.scheduleProcessing
- это то место, где он фактически планирует задание.
Вы можете скачать их образец проекта, чтобы увидеть, как он работает с OperationQueue
. https://developer.apple.com/documentation/backgroundtasks/refreshing_and_maintaining_your_app_using_background_tasks