Я пытаюсь запустить небольшую задачу в моем приложении, которая просто получает немного данных из моей базы данных и делает несколько очень простых проверок, если эти проверки проходят, они отправляют уведомление. Однако я не могу заставить его работать независимо от того, что я пытаюсь, я также пытался использовать старую систему UIApplication.setMinimumBackgroundFetchInterval (imumBackgroundFetchInterval :) с функцией в моем делегате приложения, но она не работала так же хорошо.
Я настроил мои «Разрешенные идентификаторы планировщика фоновых задач» в моем Info.plist и добавил соответствующие возможности в мое приложение, проверив «Фоновая выборка» и «Фоновая обработка»
Вот мой AppDelegate:
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.harrison.DogCheck.refresh",
using: DispatchQueue.global()
) { task in
self.handleAppRefresh(task)
}
return true
}
private func handleAppRefresh(_ task: BGTask) {
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
let appRefreshOperation = MyOperation()
queue.addOperation(appRefreshOperation)
task.expirationHandler = {
queue.cancelAllOperations()
}
let lastOperation = queue.operations.last
lastOperation?.completionBlock = {
task.setTaskCompleted(success: !(lastOperation?.isCancelled ?? false))
}
scheduleAppRefresh()
}
func applicationDidEnterBackground(_ application: UIApplication) {
scheduleAppRefresh()
}
private func scheduleAppRefresh() {
do {
let request = BGAppRefreshTaskRequest(identifier: "com.harrison.DogCheck.refresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 30 * 60)
try BGTaskScheduler.shared.submit(request)
} catch {
print(error)
}
}
}
Вот MyOperation:
class MyOperation: Operation {
override func main() {
NotificationHandler.check() {
self.cancel()
}
}
}
NotificationHandler.check () просто делает запрос к базе данных, и простая проверка logi c запускает это закрытие, когда оно завершается. Я убедился, что эта функция никогда не вызывается, несмотря ни на что.