Pourquoi les tâches de fond sont importantes pour iOS App Responsiveness

Les utilisateurs s'attendent à ce que les applications iOS se sentent instantanées – les transitions devraient être fluides, les interactions devraient être immédiates et le contenu devrait être neuf dès l'ouverture de l'application. Pour y parvenir, il faut effectuer des travaux de déchargement qui n'ont pas à se produire au premier plan. Les tâches de fond permettent à votre application d'effectuer des opérations comme la synchronisation des données, la pré-traitement du contenu ou le nettoyage sans bloquer l'interface utilisateur.

La clé est d'utiliser le mode d'exécution de fond approprié pour chaque opération et d'obéir aux règles strictes d'iOS sur l'exécution de fond. iOS est conçu pour prioriser l'application actuelle de l'utilisateur et pour tuer les processus de fond lorsque des contraintes de mémoire ou de puissance le nécessitent.

Comprendre l'exécution de fond dans iOS

iOS fournit plusieurs mécanismes pour le travail de fond, chacun adapté à différents cas d'utilisation.Le BackgroundTasks framework est l'approche recommandée pour les tâches déterrables qui n'ont pas besoin de se produire à un moment précis. Il fonctionne en ayant les tâches de calendrier système à des moments optimaux, en tenant compte de facteurs tels que la connectivité réseau, le niveau de batterie, et les modèles d'engagement des utilisateurs.

D'autres modes d'exécution de fond existent pour des scénarios spécifiques:

  • Regarder la page – une petite opportunité (environ 30 secondes) de télécharger périodiquement de petites quantités de contenu.
  • Traitement de fond[ – une fenêtre plus longue (minutes) pour des tâches plus lourdes comme la maintenance de la base de données ou la taille des actifs.
  • Notifications à distance – réveil de l'application pour traiter les charges utiles avec le drapeau .
  • – téléchargement ou téléchargement de données même si l'application est suspendue ou terminée.
  • VoIP / audio / location – modes spécialisés qui maintiennent l'application en marche pendant de longues périodes.

Pour les travaux généraux de fond qui peuvent être programmés sans qu'il soit nécessaire de faire face à l'urgence de l'utilisateur, l'API BGTaskScheduler est le meilleur choix. Elle consolide l'horaire, réduit le risque d'être tué par le système et améliore la durée de vie des batteries par rapport aux anciennes approches comme .

Éléments clés du cadre de travail des tâches de base

  • BGProcessingTask – destiné à des tâches qui prennent un temps remarquable, comme effectuer une synchronisation complète, nettoyer les fichiers mis en cache ou mettre à jour une base de données locale. Le système donne à ces tâches un budget de temps plus important (minutes) et les planifie lorsque les conditions sont favorables (p. ex., appareil sur Wi-Fi et charge).
  • BGAppRefreshTask – conçu pour des mises à jour courtes, généralement de quelques secondes. Utilisez-le lorsque l'application doit mettre à jour des données de l'interface utilisateur ou récupérer de petites quantités de contenu de sorte que la prochaine fois que l'utilisateur ouvre l'application, il affiche de nouvelles informations. Le système essaie d'exécuter ces tâches avant que l'utilisateur lance l'application.
  • BGTaskScheduler – le gestionnaire central qui enregistre les identifiants, soumet les demandes et contrôle les mains à votre gestionnaire lorsque la tâche commence. Il gère également l'expiration et le rééchelonnement.

Les deux types de tâches partagent un cycle de vie similaire : enregistrer, programmer, manipuler et rééchelonner. Le système décide exactement quand exécuter la tâche ; vous ne pouvez fournir qu'un indice via . Cette conception respecte les ressources de l'appareil utilisateur et empêche les applications de tourner en arrière-plan.

Mise en oeuvre des tâches de base – Guide étape par étape

Pour intégrer les tâches de fond dans votre application iOS, vous devez accomplir plusieurs étapes : activer la capacité, enregistrer les identifiants de tâches, planifier le travail, gérer l'exécution et gérer l'expiration.

1. Activer la capacité des modes de fond

Dans Xcode, accédez à votre cible Signing & Capabilities onglet et ajoutez la modes de fond[ capacité. Vérifiez au moins traitement de fond[ et/ou extraction de fond[ selon les types de tâches que vous prévoyez d'utiliser. Pour BGAppRefreshTask, il faut vérifier extraction de fond; pour BGProcessingTask, ]traitement de fond est nécessaire.

2. Identification des tâches

Chaque tâche d'arrière-plan doit avoir une chaîne d'identificateur unique, généralement au format inverse-DNS (p. ex. ). Vous enregistrez ces identifiants au début du cycle de lancement des apps, comme dans .

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
 BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.myapp.refresh", using: nil) { task in
 self.handleAppRefresh(task: task as! BGAppRefreshTask)
 }
 BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.myapp.cleanup", using: nil) { task in
 self.handleDatabaseCleanup(task: task as! BGProcessingTask)
 }
 return true
}

La fermeture capture l'objet de la tâche ; à l'intérieur, vous appelez votre propre gestionnaire. N'oubliez pas de jeter la tâche au type de béton approprié.

3. Tâches de base du calendrier

La soumission des requêtes doit se faire lorsque l'application va à l'arrière-plan ou lorsqu'un besoin récurrent se produit. Le indique dès le plus tôt que vous souhaitez que la tâche soit exécutée, mais le système peut la retarder davantage.

func scheduleAppRefresh() {
 let request = BGAppRefreshTaskRequest(identifier: "com.example.myapp.refresh")
 request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) // at least 15 minutes from now
 do {
 try BGTaskScheduler.shared.submit(request)
 } catch {
 print("Could not schedule app refresh: \(error.localizedDescription)")
 }
}

func scheduleDatabaseCleanup() {
 let request = BGProcessingTaskRequest(identifier: "com.example.myapp.cleanup")
 request.earliestBeginDate = Date(timeIntervalSinceNow: 60 * 60) // at least 1 hour
 request.requiresNetworkConnectivity = true // only run when network is available
 request.requiresExternalPower = true // only run when device is charging
 do {
 try BGTaskScheduler.shared.submit(request)
 } catch {
 print("Could not schedule cleanup: \(error.localizedDescription)")
 }
}

Appelez ces méthodes de planification dans les endroits appropriés : par exemple, après une tâche de fond réussie (pour reprogrammer la prochaine exécution) ou lorsque l'utilisateur suspend l'application. Vous pouvez également les appeler en réponse à des actions de l'utilisateur qui indiquent un besoin de mises à jour périodiques.

4. Gérer l'exécution des tâches

Lorsque le système décide d'exécuter une tâche de fond, il invoque le gestionnaire que vous avez enregistré.

  • Définir un gestionnaire d'expiration qui annule le travail en cours et marque la tâche comme incomplète si le temps s'épuise.
  • Effectuer le travail réel (p. ex., recherche de réseau, exploitation de bases de données).
  • Appeler une fois que le travail a fini (ou après l'échec).
  • Planifiez la prochaine occurrence de la tâche (sauf si la tâche est censée être ponctuelle).
func handleAppRefresh(task: BGAppRefreshTask) {
 // Reschedule the next refresh immediately.
 scheduleAppRefresh()

 // Set an expiration handler that will be called if the system needs to reclaim time.
 task.expirationHandler = {
 // Cancel any ongoing operations, clean up resources.
 // Do NOT call setTaskCompleted here; the system will mark it as expired.
 }

 // Perform background work (e.g., fetch new data from server).
 fetchLatestData { success in
 // After the work completes (or errors), inform the scheduler.
 task.setTaskCompleted(success: success)
 }
}

Pour une tâche BGProcessing, le modèle est identique mais le budget de temps est plus important. Vous pouvez également effectuer des opérations plus lourdes comme compacter un stockage de données de base ou redimensionner des images.

5. Essais des tâches de fond

Les tâches de fond sont notoirement difficiles à tester parce que le système décide quand les exécuter. Utilisez les techniques suivantes pour simuler l'exécution:

  • Utilisez le débogueur Xcode : lancez l'application, puis arrêtez et utilisez la commande (via lldb ou -Simula Background Fetch-de-simula dans le simulateur).
  • Pour BGProcessingTask, utilisez l'appel immédiatement après l'enregistrement, puis mettez l'application en arrière-plan. Le système peut l'exécuter en quelques minutes.
  • Utilisez l'approche dans une compilation de débogue : appelez et soumettez à nouveau pour déclencher les journaux de programmation.
  • Surveillez l'exécution des tâches en définissant les points d'arrêt dans votre gestionnaire et en vérifiant la console pour les journaux.

Meilleures pratiques pour la mise en oeuvre de la tâche de fond robuste

Suivre ces lignes directrices aidera votre application à rester réactive, à conserver la batterie et à passer l'examen App Store.

Tâches d'idéoponte de conception

Les tâches de fond peuvent être interrompues à tout moment. Assurez-vous que votre travail est idémpotent – l'exécuter plusieurs fois produit le même résultat que l'exécuter une fois. Par exemple, utilisez une logique de mise à niveau au lieu d'insérer-seulement.

Respectez le maître de l'expiration

Le gestionnaire d'expiration est votre dernière chance d'arrêter gracieusement le travail. En aucun cas vous ne devriez l'ignorer. Si le système force la fin, tout le travail inachevé est perdu. Dans le gestionnaire, annuler toute tâche réseau en cours, libérer les verrous, et enregistrer l'état de contrôle afin que la prochaine course puisse reprendre.

Ne pas trop programmer

Chaque soumission consomme les ressources du système pour la tenue de livres. Le sur-planning peut conduire au système qui étouffe votre application ou rejette les tâches. Une bonne cadence pour BGAppRefreshTask est toutes les 15 à 30 minutes au plus; BGProcessingTask peut fonctionner tous les jours ou toutes les semaines.

Utiliser les contraintes avec sagesse

Si votre tâche peut être exécutée hors ligne, omettez l'exigence de réseau – le système aura plus de flexibilité de programmation et pourrait fonctionner plus tôt. De même, exiger de l'alimentation externe retarde la tâche jusqu'à ce que l'appareil soit branché, ce qui est seulement approprié pour les travaux lourds CPU/IO.

Gardez la lumière de travail dans BGAppRefreshTask

Ces tâches ont quelques secondes d'heure de wall-clock avant l'expiration. N'obtenez que ce qui est nécessaire pour mettre à jour votre état de l'interface utilisateur.

Essai sur des dispositifs réels

Le simulateur ne reproduit pas entièrement le comportement de planification des tâches de fond. Testez sur un appareil physique avec des conditions de batterie, de réseau et de charge variables. Utilisez le Log Energy dans l'Organisateur Xcode pour voir comment votre application affecte la durée de vie de la batterie.

Poignez les erreurs et ré-échelonnez-les

Si une tâche de fond échoue (par exemple, erreur réseau), vous devriez quand même la rééchelonner pour une période ultérieure. Utilisez un délai de ré-essai exponentiel ou un intervalle de ré-essai fixe. N'appelez pas sans rééchelonnement, car le système peut arrêter complètement d'accorder l'exécution.

Pièges et dépannage courants

Voici les problèmes fréquents rencontrés lors de la mise en œuvre des tâches de base et la façon de les résoudre.

Tâche ne s'exécute jamais

Raisons possibles:

  • Capacité manquante – vérifier que les modes de fond sont activés.
  • Identificateur d'inadéquation – s'assurer que la chaîne utilisée dans correspond à celle de l'Info.plist ou dans .
  • Tâche non soumise à nouveau – après qu'une tâche a été accomplie (ou échoue), vous devez la programmer à nouveau pour les futures courses.
  • Délais système – iOS peut retarder l'exécution de l'arrière-plan si le périphérique est sous charge lourde, faible sur la batterie ou en mode faible puissance. Vérifiez l'état de l'appareil.

Pour déboguer, activez l'enregistrement : définissez loging via dans une compilation de débogue. Ensuite, observez la console pour les messages sur l'ordonnancement et l'exécution.

Tâche Expire fréquemment

Si votre tâche atteint souvent le gestionnaire d'expiration, cela signifie que vous essayez de faire trop dans le temps imparti. Profiler avec Instruments (Time Profiler) peut révéler des goulets d'étranglement. Déplacer les opérations lourdes vers BGProcessingTask, ou casser le travail en petits morceaux et suivre les progrès.

Avertissements ou crashes de mémoire

Les tâches de fond s'exécutent dans un environnement limité. Allouez et traitez soigneusement les grands objets. Utilisez les piscines de libération automatique pour les boucles qui créent de nombreux objets temporaires. Si l'application s'écrase, vérifiez les journaux de plantage pour la terminaison à faible mémoire. Considérez comme un endroit pour libérer des données caches.

Techniques avancées et considérations du monde réel

Pour les applications qui doivent équilibrer la réactivité avec le travail de fond, envisager de combiner les tâches de fond avec d'autres fonctionnalités iOS.

Combiner les tâches de fond avec les notifications de poussée

Pour les mises à jour sensibles au temps, utilisez les notifications à distance avec la touche . Ceci réveille l'application en arrière-plan pour une fenêtre d'exécution courte (similaire à BGAppRefreshTask). Pour les mises à jour déterrables, revenez aux tâches de fond programmées. Cette approche hybride assure un contenu frais tout en respectant la durée de vie de la batterie.

Synchronisation avec CloudKit ou les données de base

Pour les données de base, utilisez le suivi de l'historique persistant afin que les importations de fond ne soient pas en conflit avec les lectures de premier plan. Effectuez toujours des écritures sur un contexte de fond privé.

Suivi de l'exécution des tâches

Utilisez le Energy Log[ dans Xcode (Window > Organisateur > Crashes & Energy > sélectionnez l'application > open Energy Log) pour voir à quelle fréquence les tâches de fond s'exécutent, leur durée et leur impact sur la batterie.

Références externes

Pour une étude plus approfondie, consultez ces ressources faisant autorité :

Conclusion

Mise en œuvre des tâches de fond avec BGTaskScheduler et [BGProcessingTask[ / BGAppRefreshTask[ vous permet de construire des applications iOS qui se sentent rapides et réactives tout en exécutant le travail de fond nécessaire. En suivant l'approche systématique décrite ci-dessus – permettant les capacités, enregistrant les identifiants, en planifiant judicieusement, en gérant l'exécution avec grâce et en respectant les contraintes du système – vous pouvez vous assurer que votre application équilibre la fraîcheur avec efficacité.