Apple Watch – Obtenir des données uniquement si l'application sur le téléphone est active

J'ai développé et déployé notre Apple Watch Extension App en utilisant le simulateur. Il a été approuvé et est disponible dès maintenant sur l'App Store, donc Apple est heureux!

Aujourd'hui, j'ai pu mettre la main sur une montre physique et avoir découvert un vrai problème – je ne peux interagir avec le téléphone de surveillance, si l'application sur mon téléphone n'est pas seulement ouverte, mais aussi active … vaincre l'object.

appDelegate la méthode ci-dessous dans l' appDelegate de l'application téléphonique en tant que proxy pour get mes données en direct et les renvoyer à la montre.

Je passe essentiellement une request à l' appDelegate – je vérifie l'userInfo pour lequel datatables doivent être returnnées, puis l'application téléphone fait l'affaire et returnne un dictionary userInfo contenant des données pour la montre à parsingr:

 -(void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply { if ([userInfo objectForKey:@"GetWatchData"]) { [TPWatchData configureWatchData:^(BOOL success) { if (success) { reply([TPWatchData watchData]); } else { reply(@{@"FAIL":@"AppDelegate"}); } }]; } } 

Je l'appelle dans la montre en utilisant cette approche sur l' watch extension la watch extension (juste un exemple des appels que je fais):

  [TPWPlanList openParentApplication:@{@"GetWatchData":@1} reply:^(NSDictionary *replyInfo, NSError *error) { if ([replyInfo objectForKey:@"Overview"]) { if (error.code == 0) { if ([replyInfo objectForKey:@"FAIL"]) { // Something failed } else { self.dic_overview = [replyInfo objectForKey:@"Overview"]; //[self reloadPlanListTable]; } } else { // Something failed } } }]; 

Comme déjà dit, cela a fonctionné parfaitement dans le simulateur et fonctionne parfaitement sur la montre physique – mais seulement si j'ai l'application principale ouverte sur le téléphone et active. La minute où l'application est en arrière-plan ou l'affichage du téléphone dort, aucune donnée n'est transmise en utilisant la méthode ci-dessus.

Des pensées? Je suis clairement en train de faire quelque chose de mal, mais j'ai réussi à en arriver à ce que tout soit en direct et sur de vrais appareils, avant que ça morde.

Merci beaucoup!

Si votre openParentApplication:reply: ne fonctionne que lorsque l'application iOS de l'hôte est active, je peux à peu près garantir que votre application iOS sera supprimée en arrière-plan avant de pouvoir répondre.

La solution consiste à faire en sorte que l'application réponde à la request le plus rapidement possible, puis terminez votre tâche normale. Il y a une note à ce sujet dans les forums des développeurs: https://devforums.apple.com/thread/264473?tstart=0

J'ai également écrit un billet détaillant les methods que j'ai utilisées avant que la note ne soit ajoutée dans les forums: http://www.fiveminutewatchkit.com/blog/2015/3/11/one-weird-sortingck-to-fix- openparentapplicationreply