NSExtension运行时警告[NSXPCDecoder validateAllowedClass:forKey:]如何修复?
运行时警告修复方案
该警告是iOS 16及以上版本引入的NSSecureCoding安全检查触发的,默认Xcode生成的Share Extension模板使用字典格式的激活规则,会让系统内部XPC解码时默认允许NSObject类从而触发警告。
具体操作步骤
- 修改Share Extension的Info.plist中
NSExtensionActivationRule的类型,从默认的Dictionary改为String,值替换为精确的谓词字符串:
<key>NSExtensionActivationRule</key> <string>SUBQUERY (extensionItems, $extensionItem, SUBQUERY ($extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url").@count = 1).@count = 1</string>
修改后完整的NSExtension节点配置如下:
<key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>NSExtensionActivationRule</key> <string>SUBQUERY (extensionItems, $extensionItem, SUBQUERY ($extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url").@count = 1).@count = 1</string> </dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.share-services</string> </dict>
- 检查自行编写的Share Extension业务代码中是否有使用
NSKeyedUnarchiver解码跨进程数据的逻辑,如果有不要设置allowedClasses = [NSObject.class],明确列出所有需要解码的类,示例如下:
// Objective-C 示例 [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithObjects:NSURL.class, NSString.class, nil] fromData:data error:&error];
// Swift 示例 let decoded = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSURL.self, NSString.self], from: data)
- 完成上述修改后如果仍有警告,属于系统内部框架的实现问题,不属于应用代码问题,不会影响App Store审核,也不会导致功能异常,后续苹果系统迭代会修复该遗留警告。
内容的提问来源于stack exchange,提问作者user1046037
相关产品推荐
相关产品推荐

