2015-07-23 11 views
6

Chcę wysłać wiadomość błyskawiczną do aplikacji iOS z aplikacji zegarka. Zaimplementowałem następujący kod w wersji beta 4 XCode7 i utrzymując aplikację na pierwszym planie w obu symulatorach. Oto kod I wdrożone"isReachable" ma wartość false podczas wysyłania wiadomości z aplikacji do aplikacji na iOS

W 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); 

            }]; 
    } 
} 


W iOS klasy

 

    -(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

Na telefon, ja nie myśl, że chcesz wykonywać aktywację WCSession w viewDidLoad ViewController, powinieneś zrobić to w delegacji aplikacji didFinishLaunching – CSmith

+0

@CSmith W dokumentacji Apple, nigdy nie wspomnieli, że należy aktywować metodę aktywacji w delegacie aplikacji. musimy zadzwonić przed wysłaniem jakichkolwiek wiadomości. przeczytaj dokument i komentarz. [link] (https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WCSession_class/index.html#//apple_ref/occ/instm/WCSession/activateSession) – Nagendra

+0

Wyświetl podgląd Łączność Wideo WWDC 2015, wyraźnie mówią, że nie należy robić tego, co robisz – CSmith

Odpowiedz

4

Czy trzeba używać sendMessage API? Stwierdziłem, że są niewiarygodne i nieprzewidywalne. Skończyłem z wykorzystaniem interfejsów API applicationContext. Zegarek nie musi być osiągalny, ale jeśli jest, natychmiast przychodzi, jeśli nie jest dostępny, zostaje dostarczony po uruchomieniu aplikacji. Za każdym razem, gdy aktualizujesz kontekst aplikacji, zastępuje on poprzednią wersję, która może nie być tym, czego szukasz.

1

Najpierw należy sprawdzić, czy Watch Link Framework jest poprawnie podłączony, sprawdź również swój kod. Potem spróbuj z "Resetuj zawartość i ustawienia" z obu symulatorów, to działało dla mnie. Jeśli to nie działa, spróbuj odinstalować i ponownie zainstalować obie aplikacje z symulatorów. Jeśli nadal nie działa, spróbuj usunąć rozszerzenie aplikacji do obejrzenia z ustawień aplikacji Watch zainstalowanej w telefonie. Mam nadzieję że to pomoże!

2

Znalazłem w aplikacji na iPhone'a, nad którą obecnie pracuję, że potrzebuję mieć kod aktywacyjny WCSession w zarówno AppDelegate, jak i bieżący kontroler widoku. ...

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

Tak jak ty, że nie żenić z moją zrozumienia, co jest powinien być wymagane, ale to jest to, co dostaje session.reachable (Swift) równa prawdziwej

Powiązane problemy