watchOS 2 transferts de fond et files d'attente

introduction

Watch Connectivity est un nouveau cadre de communication lancé avec iOS 9 et watchOS 2. Son objectif principal est de transférer facilement et en toute transparence des informations entre une application Apple Watch et son application iOS principale..

Le cadre fournit de nombreuses fonctionnalités différentes. Il y a quelques semaines, Jorge Costa a écrit sur la possibilité d'envoyer des messages entre une application iOS et une application Apple Watch. Dans ce tutoriel, nous allons zoomer sur le transfert de données en arrière-plan..

La possibilité d’envoyer des messages est conçue pour les données dont l’autre appareil a immédiatement besoin. En revanche, les transferts en arrière-plan conviennent mieux aux gros morceaux de données dont la contrepartie n'a pas besoin immédiatement. Une exception à cette règle concerne les informations de complication, dont nous parlerons plus loin dans ce tutoriel..

Conditions préalables

Ce tutoriel nécessite que vous exécutiez Xcode 7 sur OS X 10.10 ou version ultérieure. Vous devrez également télécharger le projet de démarrage depuis GitHub..

1. Configuration du cadre

Pour utiliser le cadre Watch Connectivity, votre application iOS et votre application watchOS doivent avoir une classe conforme à la WCSessionDelegate protocole et qui configure correctement la valeur par défaut WCSession. Les méthodes du WCSessionDelegate protocole gère la réception de toutes les données via le framework Watch Connectivity et vous permet de prendre le contrôle des nouvelles données de votre application.

Ouvrez le projet de démarrage dans Xcode et modifiez-le. AppDelegate.swift. Au sommet, ajoutez ce qui suit importation déclaration:

importer WatchConnectivity

Ensuite, mettez à jour la définition de classe du AppDéléguer classe pour le rendre conforme à la WCSessionDelegate protocole.

class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate 

Nous déclarons également une propriété de type WCSession! dans le AppDéléguer classe pour stocker une référence à la valeur par défaut WCSession objet.

var session: WCSession!

Enfin, mettez à jour le application (_: didFinishLaunchingWithOptions :) méthode comme indiqué ci-dessous.

func application (application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool session = WCSession.defaultSession () session.delegate = self si WCSession.isSupported () session.activateSession () renvoie true

Dans application (_: didFinishLaunchingWithOptions :), nous obtenons une référence à la valeur par défaut WCSession objet, définissez le délégué de la session sur celui de votre application AppDéléguer instance et, si pris en charge, activer la session. le est pris en charge La méthode de classe vérifie si l'application watchOS homologue de votre application iOS est installée sur une Apple Watch couplée et est capable d'envoyer des données..

La configuration du côté watchOS est très similaire. Ouvrir ExtensionDelegate.swift et remplacez son contenu par ce qui suit:

import WatchKit import Classe WatchConnectivity ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate var session: WCSession! func applicationDidFinishLaunching () session = WCSession.defaultSession () session.delegate = self session.activateSession () func applicationDidBecomeActive ()  func applicationWillResignActive () 

Vous remarquerez que nous n'appelons pas est pris en charge sur le WCSession classe avant d'activer la session. En effet, cette méthode renvoie toujours vrai du côté watchOS.

Pour vérifier que tout fonctionne correctement, exécutez votre application Apple Watch sur l'un des deux simulateurs, comme indiqué ci-dessous..

Ensuite, exécutez votre application iOS sur le type de simulateur iPhone que vous avez sélectionné lors de l'exécution de l'application Watch..

Une fois votre application iOS lancée, votre simulateur Apple Watch doit simplement revenir au cadran de la montre, comme indiqué dans la capture d'écran ci-dessous..

2. Envoi de données

Avec le défaut WCSession objet correctement configuré, il est temps pour nous d'envoyer des données entre iOS et l'application Apple Watch.

Ouvrir TableViewController.swift et ajoutez la ligne de code suivante à la fin du createNewItem (_ :) méthode:

WCSession.defaultSession (). TransferUserInfo (item)

le transferUserInfo (_ :) La méthode accepte un dictionnaire comme seul paramètre. Une fois cette méthode appelée, le dictionnaire d’informations utilisateur que vous avez fourni est ajouté à la file d’informations à transférer..

IOS et watchOS fonctionnent conjointement pour transférer les informations à un moment opportun. Le système combiné examine l’utilisation de l’application, la durée de vie de la batterie, l’utilisation ou non de l’autre appareil, etc. Une fois que le système a transféré les informations, l’application sur l’autre appareil exécute une méthode de rappel des délégués la prochaine fois est lancé.

Il est maintenant temps pour nous d'implémenter le côté réception sur l'Apple Watch. Ouvrir ExtensionDelegate.swift et ajoutez la méthode suivante à la ExtensionDéléguer classe:

func session (session: WCSession, didReceiveUserInfo userInfo: [String: AnyObject]) dispatch_async (dispatch_get_main_queue ()) () -> Annuler si les éléments = NSUserDefaults.standardUserDefaults (). objectForKey ("items") comme? [NSDictionary] var newItems = items newItems.append (userInfo) NSUserDefaults.standardUserDefaults (). SetObject (newItems comme AnyObject, pourKey: "items") else NSUserDefaults.standardUeferDefaults. : "articles")   

Cette méthode sera appelée dès que nous exécuterons l'application Apple Watch et une fois les informations transférées avec succès..

Notez que bien que ce tutoriel ne montre qu’un exemple de transfert d’informations d’iOS vers watchOS, le WCSession et WCSessionDelegate les méthodes se comportent exactement de la même manière sur les deux plates-formes pour les transferts en arrière-plan.

Avec ce code mis en œuvre, exécutez votre application Apple Watch dans le simulateur. Ensuite, relancez l'application iPhone et appuyez sur le bouton pour créer un nouvel élément..

Maintenant, retournez au simulateur Apple Watch et appuyez sur Commande-Maj-H deux fois pour revenir à l'application la plus récente. Vous verrez que l'élément que vous venez de créer apparaît sur la montre Apple Watch..

Notez que, bien que le transfert d'informations ait eu lieu immédiatement entre les simulateurs, dans une situation réelle avec des périphériques physiques, cela ne sera pas toujours le cas..

3. Accès à la file d'attente de transfert en attente

Avec votre application iOS toujours en cours d'exécution, quittez le simulateur Apple Watch à partir de la barre de menus ou en appuyant sur Command-Q. Ensuite, appuyez sur le bouton de votre application iOS pour créer quelques éléments supplémentaires, comme indiqué ci-dessous..

Chaque fois que vous essayez de transférer des informations à l'aide de l'infrastructure Watch Connectivity, elles sont ajoutées à une file d'attente qui est progressivement effacée à mesure que les informations sont transférées. Cette file d'attente est accessible et les transferts dans la file d'attente sont également accessibles.

Cela est utile, car vous pouvez voir le nombre d’éléments en attente et même annuler des transferts spécifiques si vous en avez besoin. Les éléments que vous venez de créer sont actuellement dans la file d’informations utilisateur, car Apple Watch est actuellement déconnectée du périphérique parent, ce qui rend tout transfert impossible..

Ouvrir AppDelegate.swift et ajoutez le code suivant à la fin de application (_: didFinishLaunchingWithOptions :):

let transferts = session.outstandingUserInfoTransfers si transferts.count> 0 let transfer = transferts.first! transfer.cancel ()

Avec ce code, nous accédons aux transferts d’informations d’utilisateur en attente et, s’il en existe au moins un, annulons le premier transfert. le WCSessionUserInfoTransfer objets retournés du RemarquableUserInfoTransfers property possède également deux propriétés en lecture seule auxquelles vous pouvez accéder:

  • informations utilisateur: Cette propriété stocke le dictionnaire que vous transférez.
  • transfert: Cette propriété stocke une valeur booléenne et indique si les informations de l'utilisateur sont en cours de transfert.

Il n’existe pas beaucoup de fonctionnalités disponibles avec des transferts d’informations exceptionnels dans la structure Watch Connectivity, mais en fonction de votre application, certaines de ces fonctionnalités peuvent s'avérer très utiles..

4. Autres méthodes de transfert

Dans ce didacticiel, nous n’avons traité que des transferts d’arrière-plan d’informations utilisateur, mais il existe quelques autres moyens de transférer des données entre appareils. Chacune de ces méthodes est conçue dans un but spécifique lors de la communication entre un iPhone et une Apple Watch.

Contexte d'application

C'est à cet endroit que vous devez transférer des informations entre appareils où seules les informations les plus récentes sont pertinentes. Vous transférez un seul dictionnaire en appelant le updateApplicationContext (_: error :) méthode. le Erreur paramètre dans cette méthode est un pointeur sur un NSError objet, qui sera rempli d'informations si un problème survient lors du transfert.

Du côté de la réception, vous pouvez implémenter la session (_: didReceiveApplicationContext :) méthode ou, alternativement, accéder au contexte de l’application via le paramètre par défaut. WCSession objets receiveApplicationContext propriété.

Complication Information

C'est là que vous devez transférer un dictionnaire d'informations utilisateur unique spécifiquement pour la complication personnalisée de votre application. Vous ne pouvez envoyer des informations que du côté iOS et cela se fait avec le transferCurrentComplicationUserInfo (_ :) méthode.

La principale différence entre cela et le transferUserInfo (_ :) La méthode utilisée précédemment dans ce didacticiel est que, lors de la mise à jour d'une complication, le système tente toujours de transférer immédiatement les informations..

Notez qu'un transfert n'est pas garanti car les périphériques peuvent être déconnectés ou votre complication peut avoir dépassé son budget d'exécution en arrière-plan. Si un transfert d’informations sur les complications ne peut pas être effectué, il est ajouté à la liste. RemarquableUserInfoTransfers file d'attente où il peut être vu et annulé si nécessaire.

Notez également que si un transfert d’informations sur la complication est dans la file d’attente et que vous appelez le transferCurrentComplicationUserInfo (_ :) méthode à nouveau, le transfert existant dans la file d'attente sera invalidé et annulé.

Des dossiers

Vous pouvez même utiliser la structure Watch Connectivity pour transférer des fichiers entre appareils. Cela se fait via le transferFile (_: metaData :) méthode où le premier paramètre est un local NSURL au fichier et le second est un dictionnaire optionnel, contenant toutes les données supplémentaires associées à ce fichier.

Comme on peut s’y attendre, la réception de ce fichier est gérée par une méthode du WCSessionDelegate protocole, le session (_: didReceiveFile :) méthode pour être précis. Dans cette méthode, on vous donne un seul WCSessionFile objet contenant une nouvelle URL locale vers le fichier ainsi que les métadonnées que vous avez transférées.

Comme pour les transferts d’informations utilisateur, vous pouvez également afficher les transferts en cours ou en cours via le fichier par défaut. WCSession objets transferts de fichiers exceptionnels propriété.

Conclusion

Globalement, le cadre Watch Connectivity fournit une interface très simple et facile à utiliser pour transférer des données entre un iPhone connecté et une Apple Watch. La structure permet le transfert des dictionnaires d’informations d’utilisateur, du contexte d’application et des informations de complication, ainsi que des fichiers..

Vous devriez maintenant être à l'aise avec l'envoi et la réception d'informations à l'aide de la structure Watch Connectivity, ainsi que la manière dont vous pouvez interagir avec les transferts en attente..

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