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..
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é.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) ")
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 ")
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:
réveillé (avecContext :)
méthodewillActivate ()
méthodemanipuler(_:)
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.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..
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..