У меня есть объект пользователя, который мне нужно хранить в NSUserDefaults, и поделиться им с расширением iOS 8 (Watchkit). В основном приложении-контейнере я могу без каких-либо проблем кодировать и декодировать объект. Однако, когда я пытаюсь восстановить сохраненный объект пользователя в Extension, я получаю ошибку "'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class"
.NSInvalidUnarchiveOperationException не может декодировать ошибку объекта в расширении Apple Watch
Насколько я вижу, NSCoding был правильно реализован в объекте (и я могу кодировать и декодировать объект в «основном» приложении).
Код в приложении «Контейнер» для хранения пользовательского объекта.
//Store user data in NSUserDefaults
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mygroup"];
SFUserAccount *user = [SFUserAccountManager sharedInstance].currentUser;
NSData *userEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:user];
[defaults removeObjectForKey:@"SF User Acct1"]; //remove any old values
[defaults setObject:userEncodedObject forKey:@"SF User Acct1"];
[defaults synchronize];
SFUserAccount *decodedUser = [NSKeyedUnarchiver unarchiveObjectWithData:userEncodedObject];
Последняя строка, над которой выполняется тестовое декодирование в главном приложении, работает нормально.
Код для извлечения из NSUserDefaults и декодирования в задании расширения ниже.
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mygroup"];
NSData *archivedUser = [defaults objectForKey:@"SF User Acct1"];
if (archivedUser){
SFUserAccount *user = [NSKeyedUnarchiver unarchiveObjectWithData:archivedUser];
}
В коде расширения, я получаю " 'NSInvalidUnarchiveOperationException', причина:«*** - [NSKeyedUnarchiver decodeObjectForKey]: не может декодировать объект класса"
Любые предложения о том, где я должен начать искать? Приложение прекрасно компилирует, что заставляет меня полагать, что необходимые рамки были включены в цель расширения.
Является ли файл реализации, в котором определяется SFUserAccount, добавляется в цель расширения? – msk
Бинарный файл включен в цель. Но ваш вопрос заставил меня исследовать немного дальше. Оказывается, мне пришлось установить флаги Set Other Linker для «-ObjC -all_load». Я не уверен, что он делает, но теперь он работает! Большое спасибо за вашу помощь. – YogiBotics
Эти связующие флаги, вероятно, немного переборщит. Проверьте, не являются ли файлы классов для обеих целей. – dwery