2014-11-30 3 views
8

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

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

+1

Является ли файл реализации, в котором определяется SFUserAccount, добавляется в цель расширения? – msk

+1

Бинарный файл включен в цель. Но ваш вопрос заставил меня исследовать немного дальше. Оказывается, мне пришлось установить флаги Set Other Linker для «-ObjC -all_load». Я не уверен, что он делает, но теперь он работает! Большое спасибо за вашу помощь. – YogiBotics

+0

Эти связующие флаги, вероятно, немного переборщит. Проверьте, не являются ли файлы классов для обеих целей. – dwery

ответ

9

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

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

Ницца! Мне это нужно, когда я пытался передать пользовательский класс между хостинговым приложением iOS и расширением WatchKit. –

+0

Это правильный ответ! – OxenBoxen