2017-09-06 2 views
0

Ich habe diese beiden erklärt struct in meinem iOS-App und seine Apple-Uhr-ErweiterungwatchOS nicht nachrichts() eine Struktur

struct nonIndexStruct { 
    let name: [String] 
    let message: [String] 
} 

Ich erstelle ein Objekt wie dieses

let nIS = nonIndexStruct(name: sortedNameArray.map({ ($0).name }), message: sortedNameArray.map({ ($0).name }))

In Um es an meine Apple Watch Extension zu übergeben, legte ich das Objekt in ein dict

let chatsMasterDict:[String: Any] = ["chatsMaster": nIS]

Drucken funktioniert einwandfrei, alle Daten sind in diesem Objekt verfügbar. So senden Sie es, nenne ich

session.sendMessage(chatsMasterDict, replyHandler: nil, errorHandler: nil)

Das Problem ist jetzt, dass nichts auf der Apple-Uhr-Seite ankommt. Der errorHandler druckt nur etwas, wenn die Apple Watch App nicht geöffnet ist. (über die Uhr App nicht geöffnet)

Die Empfangsmethode auf der Apple Watch sieht so aus und es druckt alles, was es empfängt - mit Ausnahme des oben gezeigten Falles wird die Methode einfach nicht aufgerufen.

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { 
    print("didReceive") 
    print (message) 

    if let val = message["chatsMaster"]{ 
     print("chatsMaster came") 
    . . . 

Meine beste Vermutung ist, dass, obwohl die Struktur für beide Systeme zur Verfügung steht, wird die Brücke zwischen nicht „wissen“, und es nicht verarbeiten kann. Wenn die App zu schließen, bekomme ich auch

nicht Wert vom Typ werfen kann '__NSCFString' (0x12e9fe0) auf 'NSArray' (0x12ea670). 2017-09-06 12: 23: 24.237016 + 0200 APPNAME WatchKit-Erweiterung [20802: 3718623] Konnte den Wert des Typs '__NSCFString' (0x12e9fe0) nicht in 'NSArray' (0x12ea670) umwandeln.

Aber wieder passiert das nur, wenn ich den Prozess so IDK stoppe, ob das zu meinem Problem gehört.

EDIT: Apple Watch Dokumentation sagt

Die Schlüssel und Werte Ihres Wörterbuch alle Typen Eigenschaftsliste sein muss, da die Daten serialisiert werden müssen und drahtlos gesendet.

also das ist wahrscheinlich, warum es nicht funktioniert. Was ist die beste Problemumgehung? Making it Data wäre ein bisschen Overkill ich denke, wie der Inhalt meiner Struktur ist ziemlich einfach:/

Antwort

2

Es ist wirklich seltsam, dass Sie nicht einen Fehler erhalten, aber der Kern des Problems ist, dass Sie versuchen zu senden Eine benutzerdefinierte Struktur, die die sendMessage-Funktion verwendet, die nur zum Senden von Eigenschaftslistentypen verwendet werden kann.

Die beste Lösung ist (da Ihre Struktur wirklich einfach ist und alle ihre Eigenschaften Eigenschaftslistentypen sind) wahrscheinlich, Ihre Struktur in ein Wörterbuch zu konvertieren und das Wörterbuch mit sendMessage zu setzen.

struct nonIndexStruct { 
    let name: [String] 
    let message: [String] 

    func toDictionary()->[String:[String]]{ 
     var dict = [String:[String]]() 
     dict["name"] = self.name 
     dict["message"] = self.message 
     return dict 
    } 
} 

let chatsMasterDict = ["chatsMaster": nIS.toDictionary()] 
session.sendMessage(chatsMasterDict, replyHandler: nil, errorHandler: nil) 
+0

Perfekte Lösung, genau was ich brauchte! Du hast die Klammern hinter dem Rückgabetyp vergessen, aber das ist perfekt, vielen Dank! – user2875404

+1

Ich bin froh, dass ich helfen konnte.Danke für die Korrektur, ich habe meine Antwort mit den Klammern aktualisiert. –