Xcode 15 Beta 5使用SwiftData出现CoreData安全归档错误求助
问题原因
Xcode 15 Beta 5强化了CoreData对安全归档的校验规则,即便你没有在SwiftData模型里显式声明transformable属性,底层自动生成的CoreData模型仍可能在使用旧的NSKeyedUnarchiveFromDataTransformerName归档器。一方面是SwiftData当前Beta版本的默认配置尚未完全切换到安全归档逻辑,另一方面升级后残留的旧App存储数据(比如模拟器里的历史数据)也容易触发这类警告。
解决方案
1. 清理旧存储数据
先删除模拟器中的目标App,或者直接重置模拟器内容,彻底清除旧的CoreData存储文件——Beta版本迭代时,新旧存储格式的兼容性问题是这类警告的常见诱因。
2. 主动注册安全归档器
在App启动的最早期(比如App结构体的初始化方法中),手动注册NSSecureUnarchiveFromDataTransformer,强制CoreData使用安全归档逻辑:
import SwiftData import CoreData @main struct YourApp: App { init() { // 注册安全归档转换器 NSSecureUnarchiveFromDataTransformer.register() } var body: some Scene { WindowGroup { ContentView() } .modelContainer(for: LoggerItem.self) } }
3. 检查隐式Transformable属性
如果你的模型(包括代码中省略的...部分)包含自定义类型、或SwiftData默认映射为transformable的类型(比如部分复杂可选类型、自定义结构体),需要让这些类型遵循NSSecureCoding协议,并在属性上显式指定安全归档器:
// 自定义类型需实现NSSecureCoding final class CustomData: NSObject, NSSecureCoding { static var supportsSecureCoding: Bool { true } func encode(with coder: NSCoder) { // 实现编码逻辑 } required init?(coder: NSCoder) { // 实现解码逻辑 } } // 在SwiftData模型中显式配置 @Model final class LoggerItem { @Attribute(.unique) let id: UUID var title: String var created: Date var modified: Date? @Attribute(transformableBy: NSSecureUnarchiveFromDataTransformer.self) var customData: CustomData? }
关于苹果为何不默认使用正确配置
核心原因是向后兼容。大量旧项目依赖NSKeyedUnarchiveFromData处理归档数据,如果直接强制默认切换到安全归档,会导致这些旧项目的现有数据无法读取。苹果通过Beta版本的警告逐步推动开发者迁移,未来正式版才会彻底将NSSecureUnarchiveFromData设为默认值。
内容的提问来源于stack exchange,提问作者Mike

