web-dev-qa-db-fra.com

iOS 13 - L'utilisation de BGTaskScheduler ne fonctionne pas tout le temps

LE PROBLÈME: Je veux exécuter une fonction simple, 5 secondes après que l'application passe en arrière-plan.

J'ai dû implémenter BGTaskScheduler , pour supporter iOS 13. L'ancienne implémentation de BackgroundTask fonctionne pour moi sur les anciennes versions iOS.

J'ai ajouté des modes d'arrière-plan comme demandé (les accessoires BLE sont cochés car nous effectuons une petite opération BLE dans cette fonction):

enter image description here

Ensuite, j'ai préparé l'Info.plist selon la documentation ( L'identifiant est faux juste pour la question StackOverflow):

enter image description here

Avant la fin de didFinishLaunchingWithOptions , j'enregistre ma 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)
            }
        }
    }

Maintenant, lorsque l'application exécute la méthode didEnterBackground , je soumets une 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")
            }
        } 

Le problème ici est qu'il est TRÈS incohérent. Apple garantit que la tâche ne sera pas exécutée avant la date donnée, mais ne garantit pas qu'elle sera exécutée à l'heure exacte (ça me va avec un petit délai). Cependant, quand J'ai exécuté l'application, cela n'a pas fonctionné 100% du temps, peu importe si j'ai fourni un délai à la demande de tâche (en utilisant earliestBeginDate), donc il fallait essayer 7 secondes (au lieu de 5), la prochaine fois que j'ai soumis la tâche, il a pris 26 secondes, la troisième fois jamais est arrivé la fermeture.

Est-ce que j'implémente la BackgroundTask de la mauvaise manière? J'ai cherché partout sur Internet une réponse mais je n'ai rencontré personne ayant ce problème.

6
Bar Malka

Comme l'a dit badhanganesh, il semble que la tâche ne sera exécutée que lorsque le système décidera de le faire. Apple a dit que pendant WWWDC 2019, session # 707 .

2
Bar Malka