L'événement principal de l'année dans le monde des développeurs iOS et MacOS, la WWDC, satisfait invariablement toutes les personnes impliquées dans l'industrie avec la sortie de nouvelles versions du système d'exploitation, des frameworks, du matériel - en général, tout ce qui doit réellement être travaillé.
Cette année n'est pas devenue une exception et le sujet de discussion active a été la nouvelle version d'iOS, de SwiftUI et du système d'exploitation iPadOS pour vous-même-comprendre-ce-que-les-appareils.
Cependant, il y avait des sujets qui étaient moins couverts, mais pas moins intéressants à partir de cela - par exemple, une chose aussi utile que l'exécution en arrière-plan des applications a été touchée.
En bref sur le sujet
Pour ceux qui ne comprennent pas bien ce qu'est l'exécution en arrière-plan, expliquons: l'exécution en arrière-plan signifie que l'application effectue un travail dans un état lorsqu'elle ne s'exécute pas physiquement sur l'écran du smartphone de l'utilisateur (c'est-à-dire qu'elle n'est pas au premier plan) .

Cette image montre clairement dans quelles conditions l'application peut rester et comment passer de l'une à l'autre.
De plus, les développeurs Apple de cette session se sont concentrés sur la consommation de ressources (j'espère qu'il est assez évident que lorsque vous travaillez en arrière-plan, l'application continue de consommer de l'énergie). Mais il est temps de passer directement au rapport.
Ce qui s'est passé à la WWDC
En fait, les conférenciers ont commencé par la même chose que moi - ont brièvement parlé de travailler en arrière-plan et ont décrit les tâches qui y seraient effectuées.

Nous nous rapprochons du développement. Il y a 3 considérations principales pour Apple en matière de performances en arrière-plan:
- puissance
- performance
- confidentialité
Tout est assez simple - si une tâche d'application s'exécute en arrière-plan, cette exécution peut se produire pendant qu'une autre application s'exécute au premier plan. Ainsi, une limite de ressources vous est imposée pour garantir que les ressources ne sont pas consommées de manière excessive. Si ces limites sont dépassées, votre application peut être fermée de force par Apple, ce qui ralentira le temps de démarrage. En ce qui concerne la confidentialité, la société recommande fortement aux développeurs d'utiliser toutes les fonctionnalités de leur API pour informer l'utilisateur des données que l'application utilise dans son travail (même en arrière-plan).
Soit dit en passant, la liste de ces API était assez impressionnante - elles n'ont pas fait d'examen séparé, mais je vous conseille d'y prêter attention.
Oui, et lors de la session elle-même, les développeurs d'Apple ont montré un bref aperçu des possibilités en utilisant l'exemple d'application de messagerie (cela vaut la peine de regarder une vidéo de la WWDC).
ContexteTâches
Près de la moitié du rapport de cette année est consacrée à ce cadre.
2 types de tâches que cette nouveauté propose:
- Tâche d'actualisation d'application
- Tâche de traitement en arrière-plan
Tâche d'actualisation d'application
BG App Refresh Task est un type spécial de tâche d'arrière-plan que nous pouvons utiliser pour mettre à jour les données d'application. Une chose qui rend ce type de tâche très spécial est le comportement des utilisateurs. iOS apprend à quelle fréquence et à quelle heure l'utilisateur lance votre application, et essaie de lancer BGAppRefreshTask à un moment où il est peu probable que l'utilisateur utilise l'application.

Oui, cela ne fonctionnera pas plus de 30 secondes - la fonctionnalité est très désagréable, restée des versions précédentes du système d'exploitation.
Prenons un exemple de code provenant d'Internet.
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.refresh", using: DispatchQueue.global() ) { task in self.handleAppRefresh(task) } return true } private func handleAppRefresh(_ task: BGTask) { let queue = OperationQueue() queue.maxConcurrentOperationCount = 1 let appRefreshOperation = AppRefreshOperation() queue.addOperation(appRefreshOperation) task.expirationHandler = { queue.cancelAllOperations() } let lastOperation = queue.operations.last lastOperation?.completionBlock = { task.setTaskCompleted(success: !(lastOperation?.isCancelled ?? false)) } scheduleAppRefresh() } }
Il y a plusieurs points que vous devez arrêter et mieux considérer:
- Installez le gestionnaire d'expiration sur l'objet de tâche (expirationHandler), car le système fournit un temps limité pour terminer le travail et s'il est dépassé, vous devrez effacer les ressources.
- Assurez-vous que la méthode setTaskCompleted a été appelée dès que l'opération est terminée.
- BGTaskScheduler est la classe principale utilisée pour planifier le travail en arrière-plan.
Tâche de traitement en arrière-plan
Un autre type de piratage en arrière-plan est la tâche de traitement BG. Vous pouvez l'utiliser pour entraîner le modèle ML sur l'appareil ou effectuer un nettoyage dans la base de données. Apple promet que le système est en mesure d'allouer jusqu'à plusieurs minutes de temps pour ce type de tâche, ce qui est une innovation très importante pour les travaux lourds qui ne tiennent pas dans une misérable 30 secondes.
Encore un exemple:
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.train", using: DispatchQueue.global() ) { task in self.handleMLTrain(task) } return true } private func scheduleMLTrain() { do { let request = BGProcessingTaskRequest(identifier: "pl.snowdog.example.train") request.requiresExternalPower = true request.requiresNetworkConnectivity = true try BGTaskScheduler.shared.submit(request) } catch { print(error) } } }
Points importants:
- requiesExternalPower est une valeur booléenne qui indique si un périphérique connecté à une source d'alimentation est requis pour une tâche de traitement.
- requiresNetworkConnectivity - Une valeur booléenne qui indique si une connexion réseau est requise pour une tâche de traitement.
Débogage
Ici aussi, n'est pas sans commodités. Le délai entre l'heure d'exécution planifiée de la tâche en arrière-plan et le moment où le système démarre l'application pour la terminer peut être de plusieurs heures. Lors du développement d'une application, vous pouvez utiliser deux fonctions privées pour lancer une tâche et forcer son achèvement anticipé conformément au calendrier sélectionné. Les fonctionnalités de débogage ne fonctionnent que sur les appareils.
- Lancement de la tâche:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"]
- Fin anticipée forcée de la mission:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateExpirationForTaskWithIdentifier:@"TASK_IDENTIFIER"]
En conclusion
BackgroundTasks est un excellent moyen de planifier votre travail acharné avec la meilleure expérience utilisateur en utilisant votre environnement. Étant donné que depuis la 13e version du système, de nombreuses méthodes de travail en arrière-plan deviennent obsolètes, le framework restera très populaire dans les applications. Compte tenu des possibilités ci-dessus, cela est tout à fait logique.
Je recommande également de regarder une
vidéo de la WWDC , les exemples qui y sont décrits sont très intéressants.