Tôi có đối tượng người dùng cần lưu trữ trong NSUserDefaults và chia sẻ với ứng dụng tiện ích mở rộng iOS 8 (Watchkit). Trong ứng dụng vùng chứa chính, tôi có thể mã hóa và giải mã đối tượng mà không gặp bất kỳ sự cố nào. Tuy nhiên, khi tôi cố gắng truy xuất đối tượng người dùng được lưu trữ trong Tiện ích mở rộng, tôi nhận được lỗi "'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class"
.NSInvalidUnarchiveOperationException không thể giải mã lỗi đối tượng trong tiện ích mở rộng Apple Watch
Theo tôi có thể thấy NSCoding đã được triển khai chính xác trong đối tượng (và tôi có thể mã hóa và giải mã đối tượng trong ứng dụng 'chính').
Mã trong ứng dụng 'Vùng chứa' để lưu trữ đối tượng người dùng.
//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];
Dòng cuối cùng ở trên để thực hiện giải mã thử nghiệm trong ứng dụng chính hoạt động tốt.
Mã để truy xuất từ NSUserDefault và giải mã trong mục tiêu tiện ích mở rộng bên dưới.
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mygroup"];
NSData *archivedUser = [defaults objectForKey:@"SF User Acct1"];
if (archivedUser){
SFUserAccount *user = [NSKeyedUnarchiver unarchiveObjectWithData:archivedUser];
}
Trong mã mở rộng, tôi nhận được một " 'NSInvalidUnarchiveOperationException', lý do: '*** - [NSKeyedUnarchiver decodeObjectForKey:]: không thể giải mã đối tượng của lớp"
Bất kỳ lời đề nghị như nơi tôi nên bắt đầu tìm kiếm? Các ứng dụng biên dịch tốt mà dẫn tôi tin rằng các khung cần thiết đã được bao gồm trong mục tiêu mở rộng.
Tệp triển khai có xác định SFUserAccount được thêm vào mục tiêu của tiện ích không? – msk
Các nhị phân được bao gồm trong mục tiêu. Nhưng câu hỏi của bạn đã khiến tôi nghiên cứu thêm một chút. Nó chỉ ra rằng tôi đã đặt Set Other Linker Flags thành "-ObjC -all_load". Tôi không chắc chắn chính xác những gì nó làm, nhưng nó hoạt động ngay bây giờ !! Rất cảm ơn vì sự giúp đỡ của bạn. – YogiBotics
những cờ liên kết đó có lẽ là một chút quá mức cần thiết. Kiểm tra xem các tệp lớp thuộc về cả hai mục tiêu hay không. – dwery