NSInvalidUnarchiveOperationException не может декодировать ошибку объекта в расширении Apple Watch

У меня есть пользовательский объект, который мне нужно сохранить в NSUserDefaults и поделиться с расширением iOS 8 (Watchkit). В основном приложении-контейнере я могу без каких-либо проблем кодировать и декодировать объект. Однако, когда я пытаюсь восстановить сохраненный объект пользователя в Extension, я получаю ошибку "'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class".

Насколько я вижу, 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:]: не может декодировать объект класса"

Любые предложения относительно того, где я должен начать искать? Приложение прекрасно компилирует, что заставляет меня полагать, что необходимые рамки были включены в цель расширения.

Ответ 1

Чтобы ваше расширение WatchKit могло декодировать объекты SFUserAccount, ему необходимо понять класс SFUserAccount. Чтобы включить это, его следует добавить в расширение WatchKit.

  • Нажмите на название своего проекта в Навигаторе проектов, в верхней части левого столбца в Xcode. (Нажмите Cmd-1, чтобы отобразить Навигатор проекта, если он скрыт.
  • Нажмите, чтобы выделить имя вашего расширения WatchKit слева от главного окна в разделе "Цели". (ПРИМЕЧАНИЕ: выделите расширение WatchKit, а не приложение WatchKit.
  • Выберите "Сформировать фазы" в элементах вверху.
  • Рядом с "Скомпилировать источники" используйте треугольник раскрытия, чтобы просмотреть раздел, если он еще не виден.
  • Нажмите "+" в нижней части раздела, чтобы добавить новый источник.
  • Из списка выберите файл .m для класса, который необходимо добавить (в данном случае, файл SFUserAccount.m).
  • Нажмите "Добавить".
  • Сборка и запуск.