2015-07-23 5 views
6

Ich möchte eine Sofortnachricht von der Watch-App an die iOS-App senden. Implementiert den folgenden Code in XCode7 Beta 4 Version und halten Sie die Anwendung in beiden Simulatoren im Vordergrund. hier ist der Code, den ich"isReachable" ist falsch, wenn die Nachricht von der Watch-App an die iOS-App gesendet wird

In watchkit interfaceController implementiert

 

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

 

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

Am Telefon gleich, ich glauben Sie nicht, dass Sie Ihre WCSession-Aktivierung in ViewDidLoad eines ViewControllers durchführen möchten, sollten Sie dies in Ihrem App-Delegaten tun didFinishLaunching – CSmith

+0

@CSmith In der Apple-Dokumentation haben sie nie erwähnt, dass die Aktivierungsmethode im App-Delegaten aufgerufen werden sollte. Wir müssen anrufen, bevor wir irgendwelche Nachrichten senden. lies das Dokument und kommentiere es. [link] (https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WCSession_class/index.html#//apple_ref/occ/instm/WCSession/activateSession) – Nagendra

+0

Sehen Sie sich die Watch Connectivity an WWDC 2015 Video, sie sagen explizit, dass Sie nicht tun, was Sie tun – CSmith

Antwort

4

Müssen Sie die sendMessage APIs verwenden? Ich fand sie auch unzuverlässig und unberechenbar. Ich endete mit den applicationContext API's. Die Uhr muss nicht erreichbar sein, aber wenn sie es ist, kommt sie sofort an. Wenn sie nicht erreichbar ist, wird sie beim App-Start geliefert. Jedes Mal, wenn Sie den Anwendungskontext aktualisieren, wird die vorherige Version überschrieben, die möglicherweise nicht Ihren Anforderungen entspricht.

1

Zuerst sollten Sie überprüfen, ob das Watch Connectivity Framework korrekt verknüpft ist, überprüfen Sie auch Ihren Code. Nach dem Versuch mit "Reset Inhalt und Einstellungen" von beiden Simulatoren, hat dies für mich funktioniert. Falls es noch nicht funktioniert, versuchen Sie, beide Apps von Simulatoren zu deinstallieren und neu zu installieren. Wenn es immer noch nicht funktioniert, versuchen Sie, die Watch App-Erweiterung von den Einstellungen in der Watch-App zu entfernen, die auf dem Telefon installiert ist. Hoffe das hilft!

2

Ich fand in einer iPhone App, an der ich gerade arbeite, dass ich den WCSession Aktivierungscode in sowohl AppDelegate und den aktuellen View Controller haben musste.

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

Wie Sie, die mit meinem Verständnis nicht heiraten, was sollte erforderlich sein, aber es ist das, was bekam session.reachable (Swift) wahr

Verwandte Themen