【问题标题】:NSInvalidUnarchiveOperationException cannot decode object error in Apple Watch extensionNSInvalidUnarchiveOperationException 无法解码 Apple Watch 扩展中的对象错误
【发布时间】:2014-11-30 10:43:17
【问题描述】:

我有一个用户对象,我需要将其存储在 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', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class”

关于我应该从哪里开始寻找任何建议?该应用程序编译良好,这让我相信所需的框架已包含在扩展目标中。

【问题讨论】:

  • 扩展的target中是否添加了定义SFUserAccount的实现文件?
  • 二进制文件包含在目标中。但是您的问题使我进行了进一步的研究。事实证明,我必须将 Set Other Linker Flags 设置为“-ObjC -all_load”。我不确定它到底是做什么的,但它现在可以工作了!!非常感谢您的帮助。
  • 那些链接标志可能有点矫枉过正。检查类文件是否属于两个目标。
  • @YogiBotics 我在使用 NSKeyedUnarchiver 时遇到了同样的问题,但我尝试解码的类确实属于这两个目标,我尝试添加其他链接器标志,但没有运气。有任何想法吗?还是我应该提出一个新问题?

标签: objective-c nsuserdefaults ios8-extension watchkit


【解决方案1】:

为了让您的 WatchKit 扩展能够解码 SFUserAccount 对象,它需要了解 SFUserAccount 类。要启用此功能,应将其添加到您的 WatchKit 扩展中。

  1. 在 Xcode 左栏顶部的 Project Navigator 中单击您的项目名称。 (如果项目导航器处于隐藏状态,请按 Cmd-1 显示它。
  2. 单击以突出显示主窗口左侧“目标”下的 WatchKit 扩展程序的名称。 (注意:突出显示您的 WatchKit 扩展程序,而不是 WatchKit 应用程序。
  3. 在顶部的项目中选择“构建阶段”。
  4. 在“编译源”旁边,如果该部分尚不可见,请使用显示三角形查看该部分。
  5. 点击该部分底部的“+”以添加新来源。
  6. 从列表中,为您需要添加的类选择 .m 文件(在本例中为 SFUserAccount.m 文件)。
  7. 点击“添加”。
  8. 构建并运行。

【讨论】:

  • 不错!当我尝试在 iOS 主机应用程序和 WatchKit 扩展之间传递用户定义的类时,我需要这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2019-01-21
  • 2015-03-29
  • 2015-01-27
  • 2018-08-14
  • 2016-11-05
相关资源
最近更新 更多