2016-08-05 2 views
2

Dans mon application, je dois envoyer des informations de la montre InterfaceController au téléphone HomeViewController. Mais, quand je cours mon code, l'information ne fonctionne qu'une seule fois. Pour que cela fonctionne à nouveau, je dois supprimer l'application Apple Watch et le réinstaller.WCSession ne fonctionnant qu'une seule fois

InterfaceController.m:

#import "InterfaceController.h" 
#import <WatchConnectivity/WatchConnectivity.h> 

@interface InterfaceController() <WCSessionDelegate> 

@property (strong, nonatomic) WCSession *session; 

@end 

@implementation InterfaceController 

-(instancetype)init { 
    self = [super init]; 

    if (self) { 
     if ([WCSession isSupported]) { 
      self.session = [WCSession defaultSession]; 
      self.session.delegate = self; 
      [self.session activateSession]; 
     } 
    } 
    return self; 
} 

-(void)sendText:(NSString *)text { 

    NSDictionary *applicationDict = @{@"text":text}; 
    [self.session updateApplicationContext:applicationDict error:nil]; 

} 

- (IBAction)ButtonPressed { 
    [self sendText:@"Hello World"]; 

} 

HomeViewController.m:

#import "HomeViewController.h" 
#import <WatchConnectivity/WatchConnectivity.h> 

@interface HomeViewController()<WCSessionDelegate> 
@end 

@implementation HomeViewController 
@synthesize TextLabel; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    if ([WCSession isSupported]) { 
     WCSession *session = [WCSession defaultSession]; 
     session.delegate = self; 
     [session activateSession]; 
    } 
} 

- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext { 

    NSString *text = [applicationContext objectForKey:@"text"]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [TextLabel setText:text]; 
    }); 
} 

Comme mentionné précédemment, l'étiquette iOS seulement passe à "Bonjour tout le monde" une fois. Une fois que j'ai relancé l'application iOS et que son libellé de texte ne dit plus "Hello World", je n'arrive pas à faire en sorte que la montre redéfinisse l'étiquette de texte iOS sur "Hello World".

Est-ce un problème de communication entre la montre et l'iPhone, ou est-ce un problème avec le code?

Répondre

4

Il y a un problème avec le code, basé sur l'intention de updateApplicationContext:

vous devez utiliser cette méthode pour communiquer l'état change ou de fournir des données qui est mise à jour fréquemment

Dans votre cas, vous essayez de renvoyer un inchangé contexte de l'application de la montre au téléphone. Comme il n'y a pas de changement par rapport au contexte d'application précédent et que le téléphone ne reçoit rien de différent de ce qu'il a reçu précédemment, il n'y a aucune raison pour que la montre (ré) transmette quoi que ce soit, alors ce n'est pas le cas.

Ceci est une optimisation qu'Apple a conçue dans Watch Connectivity.

Comment pouvez-vous résoudre ce problème?

  • Vous pouvez remodeler votre application pour éliminer besoin de réémettre les mêmes données.

  • Si votre application doit retransmettent les mêmes informations une deuxième fois, vous devez changer votre approche:

    • You can add additional data (comme un UUID ou timestamp) dans le contexte de l'application, pour faire en sorte que la mise à jour que vous envoyez est et non identique au contexte d'application précédent que vous avez envoyé.

    • Utilisez différentes fonctionnalités WCSession, telles que sendMessage, qui vous permet de renvoyer des données identiques une deuxième fois.

+0

Et vous ne pouvez pas modifier une valeur dans un dictionnaire clé/valeur - vous devez avoir au moins un différent à chaque fois la clé. –