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

У меня есть пользовательский объект, который мне нужно сохранить в NSUserDefaults и поделиться им с приложением расширения iOS 8 (Watchkit). В приложении основного контейнера я могу без проблем кодировать и декодировать объект. Тем не менее, когда я пытаюсь получить сохраненный пользовательский объект в расширении, я получаю "'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.

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