watchOS不能将sendMessage()作为结构

时间:2017-09-06 10:47:46

标签: ios swift watchkit watch-os

我在我的iOS应用程序及其Apple Watch扩展程序中声明了此结构

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

我创建了一个像这样的对象

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

为了将它传递给Apple Watch Extension,我将对象放入dict

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

打印此工作完全正常,此对象中提供了所有数据。要发送它,我打电话

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

现在的问题是,Apple Watch方面没有任何内容。 errorHandler仅在Apple Watch App未打开时打印。 (关于手表应用程序未打开)

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-09-06 12:23:24.237016 + 0200 APPNAME WatchKit Extension [20802:37186​​23]无法转换类型' __ NSCFString' (0x12e9fe0)到' NSArray' (0x12ea670)。

但同样,只有当我停止这个过程时才会发生这种情况,这是否与我的问题有关。

编辑:Apple Watch文档说

  

词典的键和值必须都是属性列表   类型,因为数据必须被序列化并以无线方式发送。

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

1 个答案:

答案 0 :(得分:4)

您没有收到错误真的很奇怪,但问题的核心是您尝试使用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)