watchOS 不能 sendMessage() 一个结构

watchOS can't sendMessage() a struct

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

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

我创建了一个这样的对象

let nIS = nonIndexStruct(name: sortedNameArray.map({ ([=12=] ).name }), message: sortedNameArray.map({ ([=12=] ).name }))

为了将它传递给我的 Apple Watch Extension,我将对象放入字典中

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

打印这个效果非常好,所有数据都在这个对象中可用。要发送它,我调用

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

现在的问题是 Apple Watch 端没有任何东西到达。 errorHandler 仅在 Apple Watch App 未打开时打印一些内容。 (关于手表a​​pp打不开)

Apple Watch 上的接收方法如下所示,它会打印接收到的所有内容 - 除了上面显示的情况外,根本不会调用该方法。

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

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

我最好的猜测是,尽管该结构对两个系统都可用,但中间的桥梁 "know of" 不可用,也无法处理它。关闭应用程序时,我还会得到

Could not cast value of type '__NSCFString' (0x12e9fe0) to 'NSArray' (0x12ea670). 2017-09-06 12:23:24.237016+0200 APPNAME WatchKit Extension[20802:3718623] Could not cast value of type '__NSCFString' (0x12e9fe0) to 'NSArray' (0x12ea670).

但同样,只有当我停止进程时才会发生这种情况,所以请确定这是否与我的问题有关。

编辑:Apple Watch 文档说

The keys and values of your dictionary must all be property list types, because the data must be serialized and sent wirelessly.

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

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