我在我的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:3718623]无法转换类型' __ NSCFString' (0x12e9fe0)到' NSArray' (0x12ea670)。
但同样,只有当我停止这个过程时才会发生这种情况,这是否与我的问题有关。
编辑:Apple Watch文档说
词典的键和值必须都是属性列表 类型,因为数据必须被序列化并以无线方式发送。
这可能是它无法正常工作的原因。什么是最好的解决方法?使它成为Data
会有点矫枉过正,因为我的结构内容非常简单:/
答案 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)