通过 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'

到目前为止我发现了什么:

抱歉这么久 post 但我已尽一切努力寻找解决此问题的方法,但没有成功。希望这可以帮助更多遇到 WatchConnectivity Framework 问题的人。

我遇到了同样的情况,也遇到了同样的问题。经过一些搜索(没有任何运气)和试验后,我通过将 -all_load 标志添加到扩展目标中的链接器标志来解决它。

我通过使用 didReceiveMessage(NSDictionary 版本而不是 NSData)暂时解决了这个问题。

我发送了一个手动创建的单个 NSArray 的 NSDictionary,其中包含我之前自定义对象的常规 NSString。