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):
Ensuite, j'ai préparé l'Info.plist selon la documentation ( L'identifiant est faux juste pour la question StackOverflow):
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.
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 .