WatchConnectivity中transferUserInfo(_:)无法传输类问题咨询
根本原因
你的判断完全正确,这个限制确实来自参数描述里提到的**property list values(属性列表值)**要求。
虽然Swift语法层面transferUserInfo(_:)的[String: Any]参数支持存放任意类型,但WatchConnectivity底层需要将传输的字典序列化为属性列表(plist)格式完成跨设备的进程间通信,而plist格式对可存储的类型有严格的白名单限制,任意自定义类都不在这个白名单内。
合法的属性列表类型仅包含以下原生类型:
- 数值类型:
Int、UInt、Float、Double、Bool - 基础容器/值类型:
String、Data、Date - 集合类型:
Array(元素必须是合法的属性列表类型)、Dictionary(key必须为String类型,value必须是合法的属性列表类型)
即使是继承自NSObject的自定义类,也无法直接放到userInfo中传输。
解决方案
你需要先将自定义类实例转换为属性列表支持的类型再传输,常用两种实现方案:
- 让自定义类遵从
Codable协议,将实例编码为Data类型后放入传输字典,接收端收到Data后再解码还原为类实例 - 手动实现序列化逻辑,将类的所有属性拆解为原生属性列表类型组成的字典,传输该字典,接收端再通过字典属性初始化还原类实例
额外提示:即使是系统提供的非属性列表类型(比如
UIImage、UIColor)也不能直接传输,都需要先转换为Data或者其他plist兼容类型再传递。
内容的提问来源于stack exchange,提问作者MacUserT
相关产品推荐
相关产品推荐

