通过WatchConnectivity的sendMessageData将NSArray自定义对象作为NSData传递

时间:2015-10-30 00:30:30

标签: objective-c encoding watchkit watch-os-2 watchconnectivity

一旦触发了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:是非null参数。我只使用它来启动iOS应用程序上的WCSession的Delegate方法,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);该类可以在源中定义   代码或未链接的库

到目前为止我发现了:

对于这篇长篇文章感到抱歉,但是我已经尽力找到解决这个问题的方法,但没有成功。希望这可以帮助更多有WatchConnectivity Framework问题的人。

2 个答案:

答案 0 :(得分:1)

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

我发送了一个手动创建的单个NSArray的NSDictionary,它保存了我之前自定义对象的常规NSStrings。

答案 1 :(得分:0)

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