一旦触发了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问题的人。
答案 0 :(得分:1)
我通过使用didReceiveMessage(NSDictionary版本而不是NSData)暂时解决了这个问题。
我发送了一个手动创建的单个NSArray的NSDictionary,它保存了我之前自定义对象的常规NSStrings。
答案 1 :(得分:0)
我有相同的情况并遇到了同样的问题。经过一些搜索(没有任何运气)和实验,我通过将-all_load
标志添加到扩展目标中的链接器标志来解决它。