2017-09-06 70 views
0

我有这样的结构在我的iOS应用程序和它的Apple关注扩展都宣布为结构watchOS不能的sendMessage()

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

我创建这样

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

在一个对象为了将它传递给我的苹果手表扩展,我把对象写成字典

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

打印这个工作完全正常,所有数据都可以在这个对象。要发送的话,我打电话

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

现在的问题是,没有到达的Apple关注的一面。 errorHandler仅在Apple Watch应用程序未打开时打印某些内容。 (关于手表的应用程序没有被打开)

对苹果关注的接收方法是这样的,它打印收到的一切 - 除了上面显示的情况下,该方法根本不被调用。

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

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

我最好的猜测是,虽然结构是可用于两个系统,之间的桥梁并不“知道”它并不能处理它。当关闭应用程序时,我也得到

无法将'__NSCFString'(0x12e9fe0)类型的值转换为'NSArray'(0x12ea670)。 2017年9月6日12:23:24.237016 + 0200 APPNAME WatchKit扩展[20802:37186​​23]无法投类型 '__NSCFString'(0x12e9fe0)的值设为 '的NSArray'(0x12ea670)。

但是,只有当我停止该过程时,才会发生这种情况,因此idk是否与我的问题有关。

编辑:Apple关注文档说

键和你的字典里的值必须全部财产清单 类型,因为数据必须串行化和无线发送。

所以这可能是为什么它不工作。什么是最好的解决方法?使它Data会有点矫枉过正我猜想,因为我的结构的内容是非常简单的:/

回答

2

这真的很奇怪,你没有得到一个错误,但问题的核心是,你正试图发送使用sendMessage功能,只能用于发送属性列表类型的自定义结构。

最好的解决方案是(因为你的结构非常简单,它的所有属性都是属性列表类型)可能会将你的结构转换为字典并使用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

完美的解决方案,正是我所需要的!你忘了返回类型后面的括号,但这是完美的,非常感谢! – user2875404

+1

很高兴我能帮到你。感谢您的更正,我用括号更新了我的答案。 –