BackgroundTask не стреляет внутрь, когда он зарегистрирован - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь запустить небольшую задачу в моем приложении, которая просто получает немного данных из моей базы данных и делает несколько очень простых проверок, если эти проверки проходят, они отправляют уведомление. Однако я не могу заставить его работать независимо от того, что я пытаюсь, я также пытался использовать старую систему 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 запускает это закрытие, когда оно завершается. Я убедился, что эта функция никогда не вызывается, несмотря ни на что.

...