2014-11-30 19 views
8

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.

+1

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

+1

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

+0

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

Trả lời

9

Để tiện ích WatchKit của bạn có thể giải mã các đối tượng SFUserAccount, cần hiểu lớp SFUserAccount. Để kích hoạt tính năng này, nó sẽ được thêm vào phần mở rộng WatchKit của bạn.

  1. Nhấp vào tên dự án của bạn trong Điều hướng dự án, ở đầu cột bên trái trong Xcode. (Nhấn Cmd-1 để hiển thị Project Navigator nếu nó bị ẩn.
  2. Bấm để tô sáng tên của Tiện ích WatchKit ở bên trái của cửa sổ chính, trong 'Mục tiêu'. (LƯU Ý: tô sáng phần mở rộng WatchKit của bạn, không phải là WatchKit App.
  3. Chọn 'Xây dựng giai đoạn' trong các mục trên đỉnh.
  4. Next để Compile Nguồn ', sử dụng các hình tam giác để xem phần nếu nó không phải là đã nhìn thấy được.
  5. Nhấp vào '+' ở cuối phần để thêm nguồn mới.
  6. Từ danh sách, hãy chọn tệp .m cho Lớp bạn cần thêm (trong này trường hợp, tệp SFUserAccount.m).
  7. Nhấp vào 'Thêm'.
  8. Xây dựng và chạy.
+0

Rất tuyệt! Tôi cần điều này khi tôi cố gắng vượt qua lớp người dùng được xác định giữa ứng dụng máy chủ iOS và tiện ích WatchKit. –

+0

Đây là câu trả lời đúng! – OxenBoxen

Các vấn đề liên quan