iOS15中NSKeyedUnarchiver出现missingInAllowedClasses警告如何解决?
自定义DataTransformer在Xcode 13/iOS 15出现missingAllowedClasses警告处理
问题现象
Xcode 13与iOS 15环境下使用自定义DataTransformers时,会触发missingAllowedClasses相关警告,警告内容如下:
[general] *** -[NSKeyedUnarchiver _warnAboutPlistType:missingInAllowedClasses:] allowed unarchiving safe plist type ''NSString' (0x1dc9a7660) [/System/Library/Frameworks/Foundation.framework]', even though it was not explicitly included in the client allowed classes set: '{( "'NSArray' (0x1dc99c838) [/System/Library/Frameworks/CoreFoundation.framework]" )}'. This will be disallowed in the future.
可以看到警告信息中明确指定了当前设置的允许解档类为NSArray,实际解档过程中用到的NSString类型未被纳入允许列表,苹果提示该兼容逻辑后续会被强制禁止,未修复的话后续系统版本会直接触发崩溃。
解决方法
修改自定义DataTransformer中的解档代码,将所有解档过程中会用到的类全部加入允许类集合:
- 原本错误的单类指定写法示例:
// 仅指定了NSArray,未包含数组内部的NSString类型,会触发警告 NSArray *result = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class] fromData:rawData error:nil];
- 修正后的多类集合写法示例:
// 把所有会用到的类都加入允许集合 NSSet *allowedClasses = [NSSet setWithObjects: [NSArray class], [NSString class], // 如果还有其他用到的类型比如NSNumber、NSDictionary、自定义模型类等,继续往下添加即可 nil]; NSArray *result = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses fromData:rawData error:nil];
注意:如果解档内容存在多层嵌套,所有层级涉及到的所有类都需要加入allowedClasses集合,否则依然会触发对应类的缺失警告。
内容的提问来源于stack exchange,提问作者Tom GODDARD
相关产品推荐
相关产品推荐

