通过 WatchConnectivity 的 sendMessageData 将自定义对象的 NSArray 作为 NSData 传递
Posted
技术标签:
【中文标题】通过 WatchConnectivity 的 sendMessageData 将自定义对象的 NSArray 作为 NSData 传递【英文标题】:Passing NSArray of custom objects as NSData via WatchConnectivity's sendMessageData 【发布时间】:2015-10-30 00:30:30 【问题描述】:一旦 WKInterfaceController 的 didAppear 函数被触发,我会使用 sendMessageData 回调函数向 WCSession 的默认会话发送一个空的 NSData:
// WKInterfaceController
NSData *emptyData = [[NSData alloc] init];
[[WCSession defaultSession] sendMessageData:emptyData replyHandler:^(NSData *replyMessageData)
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:replyMessageData];
errorHandler:^(NSError *error)
NSLog(@"WATCH: Error from replyData %@", error);
];
emptyData NSData 对象被发送,因为 sendMessageData: 是一个非空参数。我只使用它来触发 WCSession 的 Delegate 方法,即 ios 应用程序上的 didReceiveMessageData。然后该函数中的replyHandler 将适当的数据发送回replyHandler 到WKInterfaceController。
// UITableViewController
- (void)session:(WCSession *)session didReceiveMessageData:(NSData *)messageData replyHandler:(void (^)(NSData * _Nonnull))replyHandler
[self loadData:nil onSuccess:^(NSArray *tips)
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:tips];
replyHandler(data);
];
我遇到的问题是我在 WKInterfaceController 中的以下行发生崩溃
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:replyMessageData];
这是我得到的错误:
* 由于未捕获的异常而终止应用程序 'NSInvalidUnarchiveOperationException',原因:'* -[NSKeyedUnarchiver decodeObjectForKey:]:无法解码类(Tip)对象的键(NS.objects);该类可以在源代码中定义 代码或未链接的库'
到目前为止我发现了什么:
我试图传递的 NSArray 由自定义对象 (Tip.m) 组成。我知道 NSArray 中的所有对象都必须符合 NSCoding 协议 (How to convert NSArray to NSData?),我认为这是正确的。我已经使用 initWithCoder 和 encodeWithCoder 对对象中的每个变量和对象进行了编码和解码。 我的 Tip.m 对象应该添加到我的 WatchKit 扩展 (NSInvalidUnarchiveOperationException cannot decode object error in Apple Watch extension)。添加 Tip.m 文件只会给我:来自其他对象的“架构 i386 的未定义符号”。很抱歉,这篇文章很长,但我已尽一切努力寻找解决此问题的方法,但没有成功。希望这可以帮助更多遇到 WatchConnectivity Framework 问题的人。
【问题讨论】:
这个问题已经解决了吗? @KosukeOgawa 这是一个问题还是一个声明?我正在寻找解决方案,所以如果您有解决方案的链接,我将不胜感激。 还有哪些其他对象给您“未定义符号”错误消息? 它被称为 Tip.m、Group.m 和 Tipster.m。 Tip 对象包含 Group 和 Tipster 的实例。但是这两个没有任何自定义对象。 类 Tip 是否符合 NSCoding 协议?不清楚是不是,报错信息另有说明。 【参考方案1】:我通过使用 didReceiveMessage(NSDictionary 版本而不是 NSData)暂时解决了这个问题。
我发送了一个手动创建的单个 NSArray 的 NSDictionary,其中包含我以前的自定义对象的常规 NSString。
【讨论】:
【参考方案2】:我有同样的情况并遇到了同样的问题。经过一番搜索(没有任何运气)和试验,我通过将-all_load
标志添加到扩展目标中的链接器标志来解决它。
【讨论】:
感谢您的帮助,非常感谢。将 -all_load 标志添加到扩展目标中的“其他链接器标志”中,对我来说不起作用。以上是关于通过 WatchConnectivity 的 sendMessageData 将自定义对象的 NSArray 作为 NSData 传递的主要内容,如果未能解决你的问题,请参考以下文章
使用 WatchConnectivity 框架的独立手表应用
iPhone 和 Apple Watch 之间的 WatchConnectivity 超时错误