Nouveautés de watchOS 3 tâches en arrière-plan

introduction

Avec la prochaine mise à jour de watchOS 3 sur tous les appareils Apple Watch, les performances de nombreuses applications de surveillance vont considérablement s'améliorer. Cela est principalement dû aux nouvelles formes d'exécution en arrière-plan dont les applications watchOS peuvent tirer parti pour actualiser leur contenu périodiquement et disposer toujours des dernières informations prêtes à être visualisées par l'utilisateur..

Dans ce didacticiel, je vais vous montrer comment utiliser les nouvelles API WatchKit de watchOS 3 pour que votre propre application utilise ces nouvelles tâches en arrière-plan. Il est important de noter que, même si votre application est configurée correctement pour prendre en charge ces actualisations en arrière-plan, selon la configuration de l'utilisateur, le système peut ne pas laisser votre application s'exécuter en arrière-plan..

Ce tutoriel nécessite que vous exécutiez Xcode 8 sur OS X El Capitan ou une version ultérieure..

1. Tâches de fond

La première nouvelle classe importante de watchOS 3 est la WKRefreshBackgroundTask classe. Il s'agit d'une classe abstraite que vous ne devez pas sous-classer ni créer d'instances de vous-même. Il ne définit qu'une propriété, informations utilisateur, qui peut stocker des informations supplémentaires relatives à la tâche en arrière-plan. Il définit également une seule méthode, setTaskCompleted (), que vous devez appeler vous-même pour informer le système que la tâche est terminée. Si vous n'appelez pas cette option, le système passera le maximum de temps budgété pour votre application à essayer de mener à bien la tâche, ce qui, à son tour, gaspille la batterie et nuit aux performances des autres applications..

Lorsque votre application doit gérer une tâche en arrière-plan en cours d'achèvement, le système appelle le délégué de votre extension watchOS. manipuler(_:) méthode. Le paramètre unique de cette méthode est un ensemble de WKRefreshBackgroundTask objets que vous devez parcourir et traiter en conséquence. 

Dans le cadre WatchKit, Apple fournit les quatre sous-classes concrètes suivantes: watchOS transmettra à votre délégué d’extension une instance de la classe appropriée en fonction de la tâche..

  • WKApplicationRefreshBackgroundTask est un type de tâche d'arrière-plan général qui n'est pas spécialisé pour un type d'actualisation particulier. Le cas d'utilisation le plus courant pour ce type concerne la planification d'autres tâches. Par exemple, vous pouvez planifier une actualisation de l'arrière-plan de votre application à une heure précise de la journée chaque jour. Quand le correspondant WKApplicationRefreshBackgroundTask objet est ensuite passé dans votre délégué d'extension manipuler(_:) méthode, vous pouvez créer une tâche réseau en arrière-plan pour télécharger des données afin d'actualiser le contenu de votre application..
  • WKSnapshotRefreshBackgroundTask est un type de tâche spécifique lorsque votre application doit mettre à jour son instantané. Nous discuterons des instantanés plus tard dans ce tutoriel. Pour l'instant, tout ce que vous devez savoir, c'est que l'instantané d'une application est utilisé comme image de lancement et peut également être affiché dans le dock de l'utilisateur (accessible en appuyant sur le bouton latéral). Veuillez noter que ce type de tâche en arrière-plan a une méthode d’achèvement de tâche unique que nous aborderons également plus tard..
  • WKWatchConnectivityRefreshBackgroundTask est un type de tâche lorsque vous avez transféré des données de votre iPhone à votre montre via le cadre WatchConnectivity. Comme ce cadre fournit une méthode pour transférer des données de complication directement vers la montre, ce type de tâche en arrière-plan correspondant est principalement utilisé pour planifier des mises à jour d'instantanés en réponse aux données reçues de l'iPhone.
  • WKURLSessionRefreshBackgroundTask est un type de tâche attribué à votre délégué de poste lorsqu'une tâche de mise en réseau en arrière-plan est terminée. Dans ce scénario, les méthodes de délégation que vous avez définies pour le URLSession Les objets sont toujours appelés, et c’est ici que vous devez travailler avec les données de manière appropriée. le manipuler(_:) La méthode de votre délégué d’extension n’est appelée que pour que votre application puisse répondre à l’opération réseau en cours d’achèvement. le WKURLSessionRefreshBackgroundTask ne vous donne pas accès à la URLSession objet ni les données transférées. La seule propriété supplémentaire qu’elle définit est une chaîne appelée identificateur de session que vous pouvez utiliser pour déterminer quel processus réseau a été achevé.

Planification d'une actualisation

Vous pouvez planifier une actualisation en arrière-plan dans watchOS 3. Pour une actualisation d’application ou d’instantané simple, vous pouvez utiliser les deux méthodes suivantes de toute manière. WKExtension objet. 

scheduleBackgroundRefresh (withPreferredDate: userInfo: scheduleCompletion :)

Une fois terminée, cette méthode retournera un WKApplicationRefreshBackgroundTask objectez à votre délégué d'extension. Le système watchOS essaiera de réactiver votre extension en arrière-plan à l’heure spécifiée par le Rendez-vous amoureux paramètre. 

Veuillez noter qu'il n'est pas garanti que votre application sera réveillée en arrière-plan à cette heure précise. En raison d'autres circonstances (telles que la batterie restante, d'autres applications en cours d'exécution et en mémoire, etc.), le système peut décider de réactiver votre application ultérieurement.. 

le informations utilisateur Ce paramètre sera accessible via l’un des objets de tâche d’arrière-plan transmis à votre délégué d’extension. Cela peut être particulièrement utile si vous devez envoyer des informations relatives uniquement à l'actualisation en cours. Enfin, le achèvement programmé paramètre peut fournir un bloc de code qui sera exécuté une fois que votre actualisation a été planifiée ou a échoué en raison d'une erreur.

scheduleSnapshotRefresh (withPreferredDate: userInfo: scheduleCompletion :) 

Cette méthode retournera un WKSnapshotRefreshBackgroundTask objectez à votre délégué d'extension. Les paramètres de cette méthode sont identiques à ceux utilisés lors de la planification d’une actualisation d’application régulière. La seule différence avec cette méthode est le type d'actualisation que vous planifiez..

Voici un exemple de code qui pourrait être utilisé n’importe où dans votre application watchOS pour planifier une actualisation en arrière-plan:

WKExtension.shared (). ScheduleBackgroundRefresh (withPreferredDate: Date (timeIntervalSinceNow: 60 * 60), userInfo: nil) (erreur: Erreur?) Dans si let erreur = erreur print ("Une erreur s’est produite lors de la planification de la mise à jour en arrière-plan: \ (erreur .localizedDescription) ")

Créer d'autres tâches en arrière-plan

Comme mentionné précédemment, un WKWatchConnectivityRefreshBackgroundTask est créé en réponse à l'envoi de données à la montre depuis son iPhone couplé via les API WatchConnectivity. 

Le dernier type de tâche en arrière-plan, WKURLSessionRefreshBackgroundTask, est programmé automatiquement par le système lorsque vous créez un URLSession objet avec une configuration en arrière-plan. Faire cela à partir de n’importe où dans votre application de surveillance fera en sorte que le système planifie automatiquement la demande pour vous et appelle le représentant de votre poste. manipuler(_:) méthode une fois terminée. L'exemple de code suivant contient deux fonctions dans une classe d'exemple. La première fonction configure et démarre une tâche de téléchargement en arrière-plan. La seconde est une méthode déléguée déclarée dans le URLSessionDelegate protocole.

class SomeClass: URLSessionDelegate func beginDownloadTask () let config = URLSessionConfiguration.background (withIdentifier: "exampleSessionIdentifier") let session = URLSession (configuration: config, delegate: self, delegateQueue: nil) let task = session.downloadTask (avec: URL (string: "http://www.example.com/data")!) task.resume () func urlSession (_ session: URLSession, tâche: URLSessionTask, didCompleteWithError erreur: erreur?) imprimer ("La session s'est terminée ")

2. Regarder des instantanés d'applications

Dans watchOS 3, l’application a été entièrement supprimée de la montre Apple Watch et remplacée par la Dock. Vous pouvez accéder à ce dock en appuyant sur le bouton latéral de la montre et contient un nombre illimité d'applications que l'utilisateur peut configurer:

Si votre application a été placée dans le dock d'un utilisateur, vous êtes responsable de la mise à jour de la "capture instantanée" visible affichée dans le dock.. 

Votre application est avertie lorsque vous devez mettre à jour votre instantané par un WKSnapshotBackgroundRefreshTask être passé dans votre délégué de l'extension manipuler(_:) méthode. Lorsque vous recevez cette notification, outre le fait que votre extension WatchKit soit activée en arrière-plan, le contrôleur d'interface racine de votre application est également activé en arrière-plan et hors de l'écran. Dans ce processus, les méthodes suivantes sont appelées dans cet ordre:

  1. Le contrôleur d'interface racine réveillé (avecContext :) méthode
  2. Le contrôleur d'interface racine willActivate () méthode
  3. Le délégué de l'extension manipuler(_:) méthode

À tout moment dans ces trois méthodes, vous pouvez personnaliser l'apparence de l'interface de votre application pour créer l'instantané affiché dans le dock..

La dernière étape de l'actualisation de l'instantané se produit dans le délégué de l'extension manipuler(_:) méthode. Comme pour les autres types de tâches en arrière-plan, vous devez informer le système que la tâche est terminée. Pour les rafraîchissements d'instantané, toutefois, vous devez appeler le setTaskCompleted (restoreDefaultState: installedSnapshotExpiration: userInfo :) méthode sur le WKSnapshotBackgroundRefreshTask objet. Dès que vous appelez cette méthode, watchOS enregistre l'instantané de l'interface actuelle de votre application et le garde en mémoire jusqu'au prochain rafraîchissement. Pour mieux comprendre cette méthode, passons en revue tous ses paramètres:

  • restoreDefaultState est juste une valeur booléenne spécifiant si votre instantané est du premier contrôleur d'interface de votre application. Si vous avez migré vers une autre interface, passez-le faux pour cette valeur. 
  • estimationSnapshotExpiration est un Rendez-vous amoureux objet qui spécifie quand le système doit ensuite essayer d'actualiser l'instantané de votre application. Si vous n'avez pas besoin de planifier une autre actualisation immédiatement, vous pouvez transmettre le nouveau Date.distantFuture propriété de classe.
  • informations utilisateur est une collection de données personnalisées et sera transmise à la prochaine WKSnapshotBackgroundRefreshTask objet si vous planifiez immédiatement un autre rafraîchissement.

3. Améliorations apportées à WatchConnectivity

Le framework WatchConnectivity introduit dans watchOS 2 et iOS 9 gagne également de nouvelles fonctionnalités avec watchOS 3 et iOS 10. 

Si un utilisateur a mis la complication de votre application sur le cadran de sa montre, vous pouvez alors transférer des données du téléphone vers la montre jusqu'à 50 fois par jour. Ceci est fait, comme dans iOS 9 et watchOS 2, via le WCSession transferCurrentComplication (userInfo :) méthode d'instance. Nouveauté dans watchOS 3 et iOS 10, le WCSession resteComplicationUserInfoTransfers propriété, qui vous indiquera le nombre de transferts restants pour cette journée.

Une autre nouvelle WCSession la propriété ajoutée aux mises à jour de la plate-forme de cette année est la hasContentPending property, qui est simplement une valeur booléenne indiquant s'il existe ou non des données à transférer entre l'iPhone et l'Apple Watch.

Si vous souhaitez en savoir plus sur WatchConnectivity et son fonctionnement, vous pouvez consulter nos tutoriels précédents couvrant le cadre..

  • watchOS 2: Communiquer avec un homologue

    La sortie de watchOS 2 entraîne des changements importants. L'un de ces changements est la capacité de communiquer facilement avec une contrepartie. Il y a…
    Jorge Costa
    WatchKit
  • watchOS 2: transferts de fond et files d'attente

    Watch Connectivity est un nouveau cadre de communication lancé aux côtés d’iOS 9 et de watchOS 2. Son objectif principal est de transférer facilement et…
    Davis Allie
    WatchKit

Conclusion

Globalement, les nouvelles API de watchOS 3 vous permettent d'actualiser rapidement et efficacement le contenu de votre application Apple Watch en arrière-plan. À mesure que de nouvelles applications adoptent ces nouvelles API, les performances des applications watchOS en général s’amélioreront considérablement et créeront une expérience utilisateur bien meilleure.

Le référentiel GitHub lié contient un projet watchOS 3 Xcode avec un exemple de code indiquant comment vous pouvez planifier et répondre aux actualisations en arrière-plan de vos propres applications..

Comme toujours, veillez à laisser vos commentaires dans les commentaires ci-dessous..