You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode 15 Beta 5使用SwiftData出现CoreData安全归档错误求助

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:03:31