2017-09-06 6 views
0

Je possède ce struct déclaré à la fois mon application iOS et son extension Apple Suivrewatchos ne peuvent pas sendMessage() une struct

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

-je créer un objet comme celui-ci

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

En afin de le passer à mon Apple Watch Extension, je l'ai mis dans un dict

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

Impression cela fonctionne parfaitement bien, toutes les données sont disponibles dans cet objet. Pour l'envoyer, je l'appelle

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

Maintenant, le problème est que rien arrive du côté d'Apple Watch. ErrorHandler imprime uniquement quelque chose lorsque l'application Apple Watch n'est pas ouverte. La méthode de réception sur l'Apple Watch ressemble à ceci et elle imprime tout ce qu'elle reçoit - sauf dans le cas montré ci-dessus, la méthode n'est tout simplement pas appelée.

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

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

Ma meilleure estimation est que même si la struct est disponible pour les deux systèmes, le pont entre les deux ne « connais » pas et ne peut pas le manipuler. Lors de la fermeture de l'application, je reçois également

Impossible de convertir la valeur de type '__NSCFString' (0x12e9fe0) en 'NSArray' (0x12ea670). 2017-09-06 12: 23: 24.237016 + 0200 APPNAME Extension WatchKit [20802: 3718623] Impossible de convertir la valeur de type '__NSCFString' (0x12e9fe0) en 'NSArray' (0x12ea670).

Mais encore une fois, cela ne se produit que lorsque j'arrête le processus si idk si cela concerne mon problème.

EDIT: documentation Apple Watch,

Les touches et les valeurs de votre dictionnaire doivent tous être la liste des biens types , parce que les données doivent être sérialisés et envoyés sans fil.

alors c'est probablement pourquoi cela ne fonctionne pas. Quelle est la meilleure solution de contournement? Le faire Data serait un peu exagéré je suppose que le contenu de ma structure est assez simple:/

Répondre

2

Il est vraiment étrange que vous n'obtenez pas une erreur, mais le cœur du problème est que vous essayez d'envoyer une structure personnalisée utilisant la fonction sendMessage, qui peut uniquement être utilisée pour envoyer des types de liste de propriétés.

La meilleure solution est (puisque votre structure est vraiment simple et toutes ses propriétés sont des types de liste de propriétés) probablement pour convertir votre structure en dictionnaire et définir le dictionnaire en utilisant sendMessage.

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

Solution parfaite, juste ce dont j'avais besoin! Vous avez oublié les supports derrière le type de retour mais c'est parfait, merci beaucoup! – user2875404

+1

Content de pouvoir aider.Merci pour la correction, j'ai mis à jour ma réponse avec les crochets. –