BGTaskScheduler est un framework Apple pour planifier et exécuter des tâches en arrière-plan dans les applications iOS 13 et ultérieures. Il a remplacé les obsolètes Background Fetch et performFetch, offrant une API unifiée pour travailler avec des opérations en arrière-plan. Selon Apple Developer Documentation, 2026, le framework comprend deux types de tâches : BGProcessingTask pour les opérations longues et BGAppRefreshTask pour les courtes mises à jour de contenu.
Points clés
BGTaskScheduler est un framework système Apple introduit dans iOS 13 qui gère de manière centralisée l'exécution des tâches en arrière-plan. Avant son apparition, les développeurs utilisaient UIApplication backgroundTasks, performFetch et la gestion d'événements dans appDelegate, ce qui entraînait une fragmentation du code et un comportement imprévisible.
Le framework fonctionne sur le principe de planification différée : l'application inscrit des tâches avec des identifiants uniques, et iOS détermine lui-même le moment optimal pour les exécuter. Le système prend en compte le niveau de batterie, l'activité de l'utilisateur, l'état du réseau et d'autres facteurs.
Les capacités principales incluent le travail avec des opérations en arrière-plan courtes et longues. Contrairement à AlarmManager sous Android, BGTaskScheduler ne garantit pas une heure d'exécution précise — le système se réserve le droit de retarder une tâche si les conditions sont défavorables.
BGTaskScheduler utilise une architecture basée sur des gestionnaires (handlers). L'application inscrit un gestionnaire pour chaque type de tâche, et le système l'appelle lorsque le moment approprié arrive. Le framework lui-même n'exécute pas la tâche directement — il notifie simplement l'application qu'il est temps de l'exécuter.
L'inscription commence par la déclaration de l'identifiant de la tâche dans Info.plist via le tableau BGTaskSchedulerPermittedIdentifiers. Ensuite, dans le code de l'application, la méthode registerHandler(forTaskWithIdentifier:) est appelée avec une closure comme gestionnaire.
import BackgroundTasks
let taskID = "com.example.app.refresh"
BGTaskScheduler.shared.registerHandler(
forTaskWithIdentifier: taskID,
using: DispatchQueue.global()
) { task in
task.expirationHandler = {
// appelé lors de l'arrêt forcé
}
processBackgroundTask(task as! BGAppRefreshTask)
}
Après l'inscription, l'application doit explicitement demander l'exécution de la tâche via submitTaskRequest. La demande contient l'identifiant de la tâche et la date de début la plus proche possible. Le système enregistre la demande et la traite lorsqu'il juge les conditions appropriées.
let request = BGAppRefreshTaskRequest(
identifier: taskID
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Erreur de planification : \(error)")
}
BGTaskScheduler fournit deux types principaux de tâches, chacun conçu pour son propre cas d'utilisation. Choisir le bon type affecte directement la probabilité d'exécution réussie de la tâche par le système.
BGAppRefreshTask est conçue pour les courtes mises à jour de contenu en arrière-plan : charger de nouvelles données, synchroniser avec le serveur, mettre à jour les widgets. Le temps d'exécution est limité à 30 secondes, après quoi le système force l'arrêt de la tâche. Ce type de tâche s'exécute plus fréquemment que BGProcessingTask et a une priorité plus élevée.
BGProcessingTask est conçue pour les opérations plus longues : traiter des fichiers multimédias, indexer Core Data, créer des sauvegardes. La tâche peut s'exécuter jusqu'à plusieurs minutes, mais le système la lance moins fréquemment et seulement dans des conditions favorables — branché sur secteur, Wi-Fi stable et faible charge de l'appareil.
| Paramètre | BGAppRefreshTask | BGProcessingTask |
|---|---|---|
| Limite de temps | 30 secondes | plusieurs minutes |
| Fréquence de lancement | élevée | basse |
| Conditions | quelconques | secteur + Wi-Fi |
| Nécessite secteur | non | recommandé |
| Exemple | mise à jour du fil | traitement vidéo |
L'inscription correcte est une condition obligatoire pour le fonctionnement de BGTaskScheduler. Si une tâche n'est pas inscrite dans Info.plist, le système ignorera toute demande d'exécution.
Le fichier Info.plist doit inclure le tableau BGTaskSchedulerPermittedIdentifiers avec une liste d'identifiants chaîne. Chaque identifiant doit être unique au sein de l'application. Apple recommande d'utiliser la notation de domaine inversé.
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.example.app.refresh</string>
<string>com.example.app.processing</string>
</array>
Pour planifier une tâche, utilisez la méthode submitTaskRequest. Si une tâche n'est plus nécessaire, elle peut être annulée via cancelTaskRequest ou cancelAllTaskRequests. Le système annule également automatiquement les tâches lors de la suppression de l'application ou de la réinitialisation des données.
BGTaskScheduler offre la possibilité de suivre l'état des tâches planifiées via getPendingTaskRequests. Cette méthode retourne une liste de toutes les demandes actives avec des informations sur leur type, identifiant et earliestBeginDate. Pour chaque demande, vous pouvez vérifier si elle a déjà été terminée ou annulée et décider de la reprogrammer.
Il est important de noter que le système ne fournit pas de rappel direct sur le succès d'une tâche en arrière-plan — le gestionnaire lui-même doit signaler le résultat via les propriétés de la tâche. setTaskCompleted permet de marquer une tâche comme terminée avec succès, après quoi le système peut lancer la prochaine tâche planifiée de ce type. Si une tâche n'appelle pas setTaskCompleted, le système la considère comme terminée par expiration du délai ou arrêt forcé.
Pour le diagnostic, il est recommandé d'utiliser OSLog dans le gestionnaire et de visualiser les logs via Console.app sur Mac. Apple fournit également l'outil MetricKit pour analyser les performances des tâches en arrière-plan — il collecte des données sur le temps d'exécution, la consommation d'énergie et la fréquence de lancement qui peuvent être utilisées pour l'optimisation.
// Annuler une tâche spécifique
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: taskID)
// Annuler toutes les tâches
BGTaskScheduler.shared.cancelAllTaskRequests()
// Vérifier les tâches planifiées
BGTaskScheduler.shared.getPendingTaskRequests { requests in
print("\(requests.count) tâches planifiées")
}
BGTaskScheduler impose des limitations strictes au travail en arrière-plan. Le système peut retarder une tâche indéfiniment si les conditions sont défavorables. Les développeurs doivent comprendre que le framework n'est pas conçu pour les tâches en temps réel.
Les principales limitations incluent : le système ne garantit pas l'exécution de la tâche à l'heure spécifiée, le nombre maximum de tâches simultanées est limité, et la consommation d'énergie est strictement contrôlée. L'exécution de plusieurs tâches à la suite peut entraîner leur fusion ou annulation.
Pour augmenter la probabilité d'exécution, il est recommandé de définir earliestBeginDate au moins 1 heure pour BGProcessingTask et 15 minutes pour BGAppRefreshTask. Il est également important de gérer expirationHandler — si une tâche ne peut pas respecter sa limite de temps, le système appelle ce gestionnaire pour une terminaison appropriée. La reprogrammation doit être effectuée à l'intérieur du gestionnaire lui-même pour maintenir un cycle continu de travail en arrière-plan.
Une autre limitation importante concerne les requêtes réseau. BGTaskScheduler ne garantit pas une connexion réseau active pendant l'exécution de la tâche. L'application doit vérifier indépendamment la disponibilité du réseau via NWPathMonitor et différer le traitement si la connexion est absente. Cela diffère d'Android JobScheduler qui peut activer une tâche uniquement lorsqu'il est connecté à un type de réseau spécifique. En pratique, les développeurs combinent souvent BGTaskScheduler avec des sessions URL en arrière-plan NSURLSession pour un chargement fiable des données.
À partir de macOS Catalina, BGTaskScheduler est également disponible sur Mac. Cela permet de créer des tâches en arrière-plan multiplateformes pour les applications UIKit fonctionnant sur Apple Silicon. Sur watchOS, le framework a des fonctionnalités limitées — seules de courtes BGAppRefreshTask sont disponibles pour mettre à jour les complications et synchroniser les données avec l'iPhone. Les développeurs doivent tenir compte des différences de plateforme lors de la planification de l'architecture en arrière-plan.
Apple fournit plusieurs outils pour déboguer BGTaskScheduler. La commande e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] dans lldb lance de force une tâche en arrière-plan, contournant les limitations système. Xcode dispose d'un indicateur Simulate Background Fetch dans le menu Debug qui simule une courte mise à jour en arrière-plan. MetricKit est utilisé pour l'analyse des performances — il collecte des informations sur la fréquence de lancement, la durée d'exécution et la consommation d'énergie de chaque tâche. Ces données aident à optimiser la fréquence de planification et à choisir le bon type de tâche.
En pratique, BGTaskScheduler est adapté pour mettre à jour les données des widgets, la synchronisation iCloud, le traitement des notifications push avec contenu et l'indexation pour la recherche Spotlight. Il n'est pas adapté pour les analyses en temps réel, les applications de chat ou toute tâche nécessitant une exécution immédiate.
Pour une étude approfondie de BGTaskScheduler, Apple recommande la documentation officielle de la WWDC : la session « Advances in Background Tasks » (2020) couvre la migration depuis les API obsolètes, et « Background Tasks in Practice » (2021) contient des cas d'utilisation réels. La section Energy Efficiency Guide est également utile, décrivant comment le framework s'intègre dans la stratégie globale d'économie d'énergie d'Apple. Des exemples de code sont disponibles dans le dépôt officiel Apple Developer sur GitHub avec des projets complets pour iOS et macOS.
Questions fréquentes
Background Fetch était limité à une tâche en arrière-plan par application et n'avait pas de mécanisme de priorité. BGTaskScheduler prend en charge plusieurs tâches avec différents types, fournit une API unifiée et une gestion automatique de l'énergie.
Apple ne fixe pas de limite explicite au nombre d'identifiants inscrits, mais en pratique il est recommandé de ne pas utiliser plus de 5–10 tâches. Un nombre plus important réduit la probabilité d'exécution de chaque tâche spécifique en raison de la concurrence pour les ressources système.
Pour le débogage, utilisez la commande e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.example.task"] dans lldb. Elle lance de force une tâche, contournant les limitations système. L'indicateur Xcode Simulate Background Fetch dans le menu Debug est également disponible.
Oui, BGTaskScheduler peut lancer un processus même si l'application a été fermée de force par l'utilisateur. Cependant, le système peut appliquer des retards supplémentaires, et tous les types de tâches ne garantissent pas l'exécution dans ce scénario.
Le système appelle expirationHandler, signalant à la tâche qu'elle doit se terminer. Si l'application ignore ce signal et continue de fonctionner, iOS force l'arrêt du processus. Après cela, le système peut réduire la priorité de toutes les tâches en arrière-plan de l'application.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi