2015-07-23 8 views
6

Desidero inviare un messaggio istantaneo all'app per iOS dall'app watch. Implementato il codice seguente in XCode7 versione beta 4 e mantenendo l'applicazione in primo piano in entrambi i simulatori. ecco il codice ho implementato'isReachable' è falso quando si invia un messaggio dall'app watch all'app iOS

In watchkit interfaceController

 

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

-(IBAction)buttonClicked 
{ 
    NSDictionary *applicationDict = [[NSDictionary alloc] initWithObjects:@[@"Hi"] forKeys:@[@"key"]]; 
    if([[WCSession defaultSession] isReachable]) 
    { 
     [[WCSession defaultSession] sendMessage:applicationDict 
            replyHandler:^(NSDictionary *reply) { 

             NSLog(@"%@",reply); 

            } 

            errorHandler:^(NSError *error) { 

             NSLog(@"%@",error); 

            }]; 
    } 
} 


In iOS classe app

 

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


    -(void)session:(nonnull WCSession *)session 
    didReceiveMessage:(nonnull NSDictionary *)message replyHandler:(nonnull void (^)(NSDictionary * __nonnull))replyHandler 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.testLbl.text = [message objectForKey:@"key"]; 
      [self.view setNeedsDisplay]; 
     }); 
    } 

+1

Al telefono, ho non pensare di voler eseguire l'attivazione di WCSession in ViewDidLoad di ViewController, dovresti farlo nel delegato della tua appFinishLaunching – CSmith

+0

@CSmith Nella documentazione Apple, non hanno mai menzionato che il metodo di attivazione dovrebbe essere chiamato nel delegato dell'app. dobbiamo chiamare prima di inviare qualsiasi messaggio. leggi il documento e commenta. [collegamento] (https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WCSession_class/index.html#//apple_ref/occ/instm/WCSession/activateSession) – Nagendra

+0

visualizza la connettività di controllo Video del WWDC 2015, ti dicono esplicitamente di non fare quello che fai – CSmith

risposta

4

Avete utilizzare le API sendMessage? Li ho trovati inaffidabili e imprevedibili. Ho finito per utilizzare le API applicationContext. L'orologio non deve essere raggiungibile, ma se lo è, arriva immediatamente, se non è raggiungibile, viene consegnato all'avvio dell'app. Ogni volta che aggiorni il contesto dell'applicazione, sovrascrive la versione precedente, che potrebbe non essere quella che stai cercando.

1

Prima di controllare se Watch Connectivity Framework è collegato correttamente, controllare anche il codice. Dopo di ciò prova con "Resetta il contenuto e le impostazioni" di entrambi i simulatori, questo ha funzionato per me. Nel caso in cui non funzioni ancora, prova a disinstallare e reinstallare entrambe le app dai simulatori. Se continua a non funzionare, prova a rimuovere l'estensione per l'app dell'orologio dalle impostazioni sull'app Watch installata sul telefono. Spero che questo ti aiuti!

2

ho trovato in un app iPhone Attualmente sto lavorando su questo avevo bisogno di avere il codice di attivazione WCSession in sia l'AppDelegate e la corrente di controllo View. ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    if ([WCSession isSupported]) { 
      WCSession *session = [WCSession defaultSession]; 
      session.delegate = self; 
      [session activateSession]; 
    } 
    ... 

Come te, che non si sposa con la mia comprensione di ciò che è dovrebbe ad essere richiesto, ma è quello ottenuto session.reachable (Swift) alla parità vera

Problemi correlati