一旦 WKInterfaceController 的 didAppear 函数被触发,我就会使用 sendMessageData 回调函数将一个空的 NSData 发送到 WCSession 的默认会话:
// 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:]:无法解码类(提示)的对象以获取密钥(NS.objects);该类可以在源代码或未链接的库中定义'
到目前为止我发现了什么:
- 我试图传递的 NSArray 由自定义对象 (Tip.m) 组成。我知道 NSArray 中的所有对象都必须符合 NSCoding 协议(如何将 NSArray 转换为 NSData?),我认为这是正确的。我已经使用 initWithCoder 和 encodeWithCoder 对对象中的每个变量和对象进行了编码和解码。
- 我的 Tip.m 对象应该添加到我的 WatchKit 扩展中(NSInvalidUnarchiveOperationException cannot decode object error in Apple Watch extension)。添加 Tip.m 文件只会给我:来自其他对象的“体系结构 i386 的未定义符号”。
对不起,很长的帖子,但我已经尝试了一切来解决这个问题,但没有成功。希望这可以帮助更多遇到 WatchConnectivity Framework 问题的人。