【问题标题】:watchOS can't sendMessage() a structwatchOS 无法 sendMessage() 结构
【发布时间】:2017-09-06 10:47:46
【问题描述】:

我在我的 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 扩展程序,我将对象放入一个字典中

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")
    . . .

我最好的猜测是,虽然结构对两个系统都可用,但两者之间的桥梁并不“知道”它,也无法处理它。关闭应用程序时,我也得到 ​​p>

无法将“__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 有点矫枉过正,我想我的结构的内容非常简单:/

【问题讨论】:

    标签: ios swift watchkit watchos


    【解决方案1】:

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

    【讨论】:

    • 完美解决方案,正是我所需要的!您忘记了返回类型后面的括号,但这是完美的,非常感谢!
    • 很高兴我能帮上忙。感谢您的更正,我用括号更新了我的答案。
    猜你喜欢
    • 2018-02-25
    • 2016-08-27
    • 2015-12-26
    • 2019-12-27
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2017-10-14
    相关资源
    最近更新 更多