2016-03-25 10 views
2

HeloWCSession Ausgabe mit Xcode 7.3

Bevor Xcode auf die Version 7.3 aktualisieren hatte ich eine App mit einem WatchOS 2 App, die Uhr App die func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { und die iOS-App den Anruf den übergebenen Wert nennen würde würde auswählen und einfügen . Alles war in Ordnung.

Aber da ich bemerkte Xcode 7.3 ein Problem der Aktualisierung, die func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { NUR zweimal aufgerufen wird, wenn der iOS-App zum ersten Mal gestartet wird, wenn die App oder im Hintergrund ausgeführt wird, ist diese Funktion nur einmal aufgerufen.

Wenn ich die Werte 1, 5 und 10 übergebe und die iOS App nicht läuft, werden die Werte 1, 5, 10, 1, 5 und 10 hinzugefügt. Aber wenn die App in irgendeiner Form läuft, werden die Werte 1, 5 und 10 hinzugefügt.

Irgendeine Idee warum?

Hier ist der Code von der WatchOS-Seite, an den ich selbst gedacht habe, aber nach meinen Tests werden sie nur einmal aufgerufen. Ich habe viele Tests gemacht, und das passiert nur, wenn die iOS App gestartet wird, nicht wenn sie im Hintergrund läuft.

@IBAction func ConfirmButtonPressed() { 

    let applicationDict = ["Amount out": self.AmountText ]// Create a dict of application data 
     //applicationDict = ["status": "0" ]// Create a dict of application data 
    WCSession.defaultSession().transferUserInfo(applicationDict) 
} 

Hier ist der iOS-App-Code aus dem AppDelegate

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    if (WCSession.isSupported()) { 
     print("xyz3") 
     session = WCSession.defaultSession() 
     session.delegate = self 
     session.activateSession() 
    } 

..........

func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { 

    var status = false 
    var AmountUILabel = "" 

      status = false 
     AmountUILabel = userInfo["Amount out"] as! String 
     print(userInfo["Amount out"] ) 

    let i = NSString (string: AmountUILabel).doubleValue 
     let when = NSDate() 
    let list :[AnyObject] = controller.viewControllers! 
    let j = list[1].topViewController as! AllEntriesTableViewController 

    j.AddAmount(i , date: when, what: "---", status: status) 
    } 
+0

Können Sie zeigen, was die Watch App sendet? Hat das Wörterbuch 3 Werte und Sie übertragen es zweimal? –

Antwort

2

ich in der Lage war, die Antwort herauszufinden nach ein ganzer Tag der Forschung. Ich hätte die didReceiveUserInfo mit dispatch_async

gestartet werden, die es behoben und erhöht die Kommunikationsgeschwindigkeit zwischen der Uhr App und der iOS-App.

func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { 
    dispatch_async(dispatch_get_main_queue()) { 
+0

Vielen Dank, dass Sie Ihre Lösung veröffentlicht haben. Ich habe mit dem gleichen Problem gekämpft. Dieses Video (https://developer.apple.com/videos/play/wwdc2015/713/) war sehr hilfreich, um WatchConnectivity zu verstehen, und obwohl sie erwähnen, dass diese Delegierten außerhalb der Hauptwarteschlange aufgerufen werden, hätte ich nie gedacht, dass das Duplikat verursachen könnte Anruf. – gohnjanotis

+0

Ich hatte ein Problem in meiner iOS-App, nachdem ich userInfo von der Watch OS 2-App übergeben hatte, während die iOS-App beendet wurde (erzwungenes Beenden): Das Objekt aus der Watch-App wurde zweimal erstellt, wenn die iOS-App später gestartet wurde. wrapping 'didReceiveUserInfo' es in einem' dispatch_async 'wie hier vorgeschlagen behoben das Duplizierungsproblem. – cdf1982

+1

@ cdf1982 froh, dass meine Antwort geholfen hat! – hsn