2017-11-04 2 views
0

Ich entwickle eine WatchApp, die mit der iOS App kommunizieren muss, und ich verwende die Watch Connectivity fwk, um das zu tun.WKExtension-Status und sendMessage für Live-Messaging

Jedes Mal, wenn der Benutzer meine WatchApp anzeigt, muss ich von der iOS App einen neuen Datensatz abrufen, der auf der Uhr angezeigt werden muss.

Um diese Daten zu erhalten, verwende ich sendMessage (_: replyHandler: errorHandler :) aber manchmal scheint es, dass diese Kommunikation nicht funktioniert, weil meine WatchApp nicht aktualisiert wird. Ich habe kein Problem, wenn die WatchApp von Xcode gestartet wurde, Probleme erscheinen nur, wenn ich es im wirklichen Leben benutze.

ich lösen die Synchronisation zwischen dem WatchApp und dem iOS App jedes Mal meine WatchApp Rückruf eingeschaltet ist:

  • WKInterfaceController.willActivate() (Ich habe nur einen Controller)
  • WCSessionDelegate.session (WCSession, didReceiveApplicationContext:
    [String: Alles])
    wenn die activationState == .activated
  • WCSessionDelegat e.sessionReachabilityDidChange (WCSession) wenn die
    Sitzung

Im Video „Introducing Uhr Connectivity“ für die 2015 WWDC erreichbar ist, sagt der Sprecher der WatchKit Erweiterung mussVordergrund ausgeführt werden, wenn eine interaktive Nachricht zu senden zur iOS App.

Bedeutet es, ich brauche die WKExtention.shared() überprüfen applicationState == .active vor nachrichts (_ nennen. ReplyHandler: errorhandler :), zusätzlich von WCSession.activationState ==. aktiviert?

Als mein WatchApp im Dock ist und der Benutzer zeigt das Dock, mein WatchApp hat eine WKExtension.shared(). ApplicationState == .inactive und WKExtension.shared(). IsApplicationRunningInDock == true, Can Ich benutze sendMessage (_: replyHandler: errorHandler :), um meine App in diesem Zustand zu aktualisieren?

Ich frage mich nur, welche Bedingungen ich vorher überprüfen muss, um sendMessage zu verwenden (_: replyHandler: errorHandler :).

Danke,

Antwort

0

Wenn i Uhr Verbindungsnachrichten senden .activated ich immer überprüfen session.activationState == & & session.isReachable. Außerdem sende ich normalerweise eine erste Nachricht und warte darauf, dass das Telefon antwortet, bevor Daten angefordert werden. Dies scheint Antworten zuverlässiger zu machen, als anfänglich Daten aus irgendeinem Grund anzufordern. Hier ist ein Beispiel

func sendActivationMessage() { 
    if session.activationState == .activated && session.isReachable { 
     session.sendMessage(["Watch Message" : "Activate"], replyHandler: { (reply) in 

      // Send message requesting data 

     }, errorHandler: { (error) in 

      print("***** Error Did Occur: \(error) *****") 
     }) 
    } else { 
     print("***** Activation Error *****") 
    } 
} 

Wenn print („***** ***** Aktivierungsfehler“) aufgerufen wird, dann wissen Sie, dass das Telefon nicht erreichbar ist.

+0

Danke für die Antwort!Basierend auf meiner letzten Erfahrung, denke ich nicht, dass es ausreichend ist, activationState und isReachable zu testen, da es passieren kann, dass die Sitzung aktiviert und erreichbar ist, aber die WatchApp läuft im Hintergrund (WKExtension applicationState! = Active). sendMessage (replyHandler: error :) ist für eine interaktive Nachricht und setzt voraus, dass WatchApp im Vordergrund läuft (mein Verständnis aus WWDC-Video). Ich habe die Änderung vorgenommen, um zu überprüfen, dass die WatchApp Vordergrund ist, um sendMessage() und es scheint gut funktioniert seit mehr als 24 Stunden. Warten wir es ab... – sebastien

Verwandte Themen