通过 WatchConnectivity 的 sendMessageData 将自定义对象的 NSArray 作为 NSData 传递
Passing NSArray of custom objects as NSData via WatchConnectivity's sendMessageData
一旦触发了 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);
}];
发送了空数据 NSData 对象,因为 sendMessageData: 是一个非空参数。我只用它来触发 WCSession 的委托方法,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];
这是我得到的错误:
* Terminating app due to uncaught exception
'NSInvalidUnarchiveOperationException', reason: '*
-[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (Tip) for key (NS.objects); the class may be defined in source
code or a library that is not linked'
到目前为止我发现了什么:
- 我试图传递的 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 文件只会给我: "Undefined symbols for architecture i386" from other objects.
抱歉这么久 post 但我已尽一切努力寻找解决此问题的方法,但没有成功。希望这可以帮助更多遇到 WatchConnectivity Framework 问题的人。
我遇到了同样的情况,也遇到了同样的问题。经过一些搜索(没有任何运气)和试验后,我通过将 -all_load
标志添加到扩展目标中的链接器标志来解决它。
我通过使用 didReceiveMessage(NSDictionary 版本而不是 NSData)暂时解决了这个问题。
我发送了一个手动创建的单个 NSArray 的 NSDictionary,其中包含我之前自定义对象的常规 NSString。
一旦触发了 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);
}];
发送了空数据 NSData 对象,因为 sendMessageData: 是一个非空参数。我只用它来触发 WCSession 的委托方法,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];
这是我得到的错误:
* Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (Tip) for key (NS.objects); the class may be defined in source code or a library that is not linked'
到目前为止我发现了什么:
- 我试图传递的 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 文件只会给我: "Undefined symbols for architecture i386" from other objects.
抱歉这么久 post 但我已尽一切努力寻找解决此问题的方法,但没有成功。希望这可以帮助更多遇到 WatchConnectivity Framework 问题的人。
我遇到了同样的情况,也遇到了同样的问题。经过一些搜索(没有任何运气)和试验后,我通过将 -all_load
标志添加到扩展目标中的链接器标志来解决它。
我通过使用 didReceiveMessage(NSDictionary 版本而不是 NSData)暂时解决了这个问题。
我发送了一个手动创建的单个 NSArray 的 NSDictionary,其中包含我之前自定义对象的常规 NSString。