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

Posted

技术标签:

【中文标题】通过 WatchConnectivity 的 sendMessageData 将自定义对象的 NSArray 作为 NSData 传递【英文标题】:Passing NSArray of custom objects as NSData via WatchConnectivity's sendMessageData 【发布时间】:2015-10-30 00:30:30 【问题描述】:

一旦 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: 是一个非空参数。我只使用它来触发 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:]:无法解码类(Tip)对象的键(NS.objects);该类可以在源代码中定义 代码或未链接的库'

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

我试图传递的 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 文件只会给我:来自其他对象的“架构 i386 的未定义符号”。

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

【问题讨论】:

这个问题已经解决了吗? @KosukeOgawa 这是一个问题还是一个声明?我正在寻找解决方案,所以如果您有解决方案的链接,我将不胜感激。 还有哪些其他对象给您“未定义符号”错误消息? 它被称为 Tip.m、Group.m 和 Tipster.m。 Tip 对象包含 Group 和 Tipster 的实例。但是这两个没有任何自定义对象。 类 Tip 是否符合 NSCoding 协议?不清楚是不是,报错信息另有说明。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

感谢您的帮助,非常感谢。将 -all_load 标志添加到扩展目标中的“其他链接器标志”中,对我来说不起作用。

以上是关于通过 WatchConnectivity 的 sendMessageData 将自定义对象的 NSArray 作为 NSData 传递的主要内容,如果未能解决你的问题,请参考以下文章

使用WatchConnectivity获取核心数据获取请求

使用 WatchConnectivity 框架的独立手表应用

是否可以在后台使用 WatchConnectivity

iPhone 和 Apple Watch 之间的 WatchConnectivity 超时错误

有时无法访问配对手表模拟器上的 WatchConnectivity 会话

swift WatchConnectivity Singleton演示