Mam obiekt użytkownika, który muszę przechowywać w NSUserDefaults i udostępniać z aplikacją rozszerzenia iOS 8 (Watchkit). W głównej aplikacji kontenerowej mogę kodować i dekodować obiekt bez żadnych problemów. Jednak gdy próbuję pobrać przechowywany obiekt użytkownika w rozszerzeniu, pojawia się błąd "'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class"
.NSInvalidUnarchiveOperationException nie może zdekodować błędu obiektu w rozszerzeniu Apple Watch
O ile widzę NSCoding został poprawnie zaimplementowany w obiekcie (i jestem w stanie zakodować i odkodować obiekt w "głównej" aplikacji).
Kod w aplikacji "Kontener" do przechowywania obiektu użytkownika.
//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];
Ostatni wiersz powyżej, aby wykonać dekodowanie testu w aplikacji głównej, działa poprawnie.
Kod do pobrania z NSUserDefaults i dekodowania w docelowym rozszerzeniu znajduje się poniżej.
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mygroup"];
NSData *archivedUser = [defaults objectForKey:@"SF User Acct1"];
if (archivedUser){
SFUserAccount *user = [NSKeyedUnarchiver unarchiveObjectWithData:archivedUser];
}
W kodzie rozszerzenia, dostaję " 'NSInvalidUnarchiveOperationException', przyczyna:„*** - [NSKeyedUnarchiver decodeObjectForKey:]: nie można zdekodować obiekt klasy"
sugestie co do miejsca, gdzie powinien zacząć szukać? Aplikacja kompiluje dobrze, co prowadzi mnie do przekonania, że wymagane ramy zostały włączone do celu rozszerzenia.
Czy plik implementacji, w którym zdefiniowano SFUserAccount, jest dodany w miejscu docelowym rozszerzenia? – msk
Plik binarny jest zawarty w tarczy. Ale twoje pytanie doprowadziło mnie do dalszych badań. Okazuje się, że musiałem ustawić flagę Set Other linker na "-ObjC -all_load". Nie jestem pewien, co dokładnie robi, ale teraz działa! Wielkie dzięki za Twoją pomoc. – YogiBotics
te flagi łączące są prawdopodobnie nieco przesadzone. Sprawdź, czy pliki klas należą do obu celów. – dwery