Передача NSArray пользовательских объектов как NSData через sendMessageData WatchConnectivity
Как только функция didAppear WKInterfaceController запущена, я отправляю пустой NSData в сеанс WCSession по умолчанию с функцией обратного вызова sendMessageData:
// 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 объект emptyData отправляется, потому что sendMessageData: является ненулевым аргументом. Я использую его только для запуска метода Delegate WCSession, didReceiveMessageData в приложении iOS. Затем 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 ( Как преобразовать NSArray в NSData?), Что я сделал правильно, по моему мнению. Я закодировал и расшифровал каждую переменную и объект внутри объекта с помощью initWithCoder и encodeWithCoder.
- Мой объект Tip.m должен быть добавлен в мое расширение WatchKit ( NSInvalidUnarchiveOperationException не может декодировать ошибку объекта в расширении Apple Watch). Добавление файла Tip.m только дает мне: "неопределенные символы для архитектуры i386" из других объектов.
Извините за длинный пост, но я попробовал все, чтобы найти решение этой проблемы, но безуспешно. Надеюсь, что это поможет большему количеству людей, имеющих проблемы с WatchConnectivity Framework.
2 ответа
Я решил это временно с помощью didReceiveMessage (версия NSDictionary вместо NSData).
Я отправил вручную созданный NSDictionary одного NSArray, который содержал обычные строки NSS моих предыдущих пользовательских объектов.
У меня тот же сценарий и я достиг той же проблемы. После некоторого поиска (без удачи) и экспериментов, я решил это, добавив -all_load
Пометить ссылки на флаги в расширении цели.