NSKeyedUnarchiver无法解码类NSKnownKeysDictionary1的对象

Ste*_*ton 8 exception objective-c swift

在使用Swift时尝试取消归档时,我遇到以下异常:

由于未捕获异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'*** - [NSKeyedUnarchiver decodeObjectForKey:]:无法解码类的对象(NSKnownKeysDictionary1)以获取密钥(NS.objects); 该类可以在源代码中定义,也可以在未链接的库中定义

上下文:我正在创建一个"共享链接"扩展.在我的主应用程序(用Objective C编写)中,我使用MMWormhole写出了一系列带有链接信息的字典.

    NSFetchRequest* bookmarkFetch = [NSFetchRequest fetchRequestWithEntityName:@"XX"];
    bookmarkFetch.propertiesToFetch = @[
                                        @"name", @"text", @"date", @"url"
                                        ];
    bookmarkFetch.resultType = NSDictionaryResultType;
    NSArray* bookmarks = [moc executeFetchRequest:bookmarkFetch error:NULL];

    [wormhole passMessageObject:bookmarks identifier:@"XXX"];
Run Code Online (Sandbox Code Playgroud)

数组中的值是NSStrings和NSDate.

在MMWormhole的内容中你会得到:

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:messageObject];
Run Code Online (Sandbox Code Playgroud)

messageObject只是书签数组,没有任何中间处理.

在扩展我有:

    let wormhole = MMWormhole(applicationGroupIdentifier: "group.XX", optionalDirectory:nil)
    let bookmarks = wormhole.messageWithIdentifier("XXX") as? Array<Dictionary<String,AnyObject>>
Run Code Online (Sandbox Code Playgroud)

messageWithIdentifier:最终调用它:

    id messageObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Run Code Online (Sandbox Code Playgroud)

数组被正确写出到app组文件夹 - 我可以使用另一个扩展名读取它,一个用Objective C编写.

我在模拟器中运行时会出现此异常.在32位设备(iPhone 5和iPad 3)上运行时,代码似乎可以正常工作.我目前没有要测试的64位设备.

我想我错过了一个import或一个框架,但是哪一个?

man*_*ahn 6

这只是一个侧面说明:

您可以为NSKeyedArchiver&设置类名NSKeyedUnarchiver.我没有处理CoreData就遇到了这个问题.unarchiver再也找不到我自己的课了.

设置className我的课程如下所示:

对于archiver:

NSKeyedArchiver.setClassName("MyClass", for: MyClass.self)
let data = NSKeyedArchiver.archivedData(withRootObject: root)
Run Code Online (Sandbox Code Playgroud)

而且unarchiver:

NSKeyedUnarchiver.setClass(MyClass.self, forClassName: "MyClass")
let root = NSKeyedUnarchiver.unarchiveObject(with: data)
Run Code Online (Sandbox Code Playgroud)


Ste*_*ton 2

我在 Apple 开发者论坛上提出了这个问题,并且(这一次)从 Apple 开发者关系部门得到了很好的答案。我将引用重要的部分:

\n\n
\n

NSKnownKeysDictionary1 是一个我不明白的核心数据巫毒。\n ...显然它的序列化和\n 反序列化出了问题。您是否已在虫洞两端启动并运行核心数据?无论如何,对书签数组(以及从核心数据返回的任何其他内容)进行深度复制可能更有意义,以便您可以通过 \xe2\x80\xe2\x80\x99 发送标准字典x98wire\xe2\x80\x99\n 而不是核心数据的东西。

\n
\n\n

所以我的解决方案是要么将Core Data框架添加到扩展中,要么进行深复制。(我暂时做了前者。正确的解决方案可能是后者。)

\n