错误“[一般] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:] 允许取消存档...”

Pat*_*ita 8 macos arm objective-c apple-m1 macos-monterey

我使用的是 macOS Monterey (12.0.1),而不是 iOS、objective-c、XCode 13

在为 arm64 构建应用程序后,我收到此日志消息:

[general] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:] allowed unarchiving safe plist type ''NSString' (0x1dcb1c848) [/System/Library/Frameworks/Foundation.framework]' for key 'NS.objects', even though it was not explicitly included in the client allowed classes set: '{(
    "'NSDictionary' (0x1dcaee5d0) [/System/Library/Frameworks/CoreFoundation.framework]"
)}'. This will be disallowed in the future.
Run Code Online (Sandbox Code Playgroud)

知道是什么原因造成的以及如何消除它吗?

编辑:从 macOS Monterey 开始,在 arm64 上编译的每个应用程序似乎都会发生这种情况。所以这可能是一个普通的苹果错误

Pat*_*ita 9

感谢@OI Sen,它对 NSUnarchiver 有了更深入的了解。首先 NSKeyedUnarchiver 应该像这样分配和初始化:

NSError* err;

NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:someData error:&err];
Run Code Online (Sandbox Code Playgroud)

在我的具体情况下,我使用 NSSecure 编码。因此,您必须指定解码对象的类。就我而言,它看起来像这样

NSDictionary* someDict = [unarchiver decodeObjectOfClass:[NSDictionary class] forKey:NSKeyedArchiveRootObjectKey];
Run Code Online (Sandbox Code Playgroud)

但 NSDictionary 包含额外的字符串。这就是日志消息的原因。通过将 NSString 添加到解码的类列表中,错误就消失了。

NSDictionary* someDict = [unarchiver decodeObjectOfClasses:[[NSSet alloc] initWithArray:@[[NSDictionary class],[NSString class]]] forKey:NSKeyedArchiveRootObjectKey];
Run Code Online (Sandbox Code Playgroud)