Core Data & Xcode 11:请切换到使用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDat

swift

1个回答

写回答

shouzixuan100

2025-06-21 23:20

+ 关注

苹果
苹果

Core Data 是苹果开发的一种用于管理应用程序的持久化数据的框架。在 Xcode 11 版本中,苹果引入了一种新的安全特性,要求我们在使用 Core Data 的过程中,切换到使用 "NSSecureUnarchiveFromData" 或 NSSecureUnarchiveFromDataTransformer 的子类来确保数据的安全性。

为了更好地理解这个新特性,我们首先来了解一下 Core Data 的基本概念。Core Data 是一种对象关系映射(Object-Relational Mapping,ORM)框架,允许我们以面向对象的方式来处理数据。它提供了一种简单而强大的方法来管理数据模型、持久化数据以及数据的查询和更新操作。

在之前的版本中,我们可以直接使用 "NSKeyedUnarchiver" 类来解档数据。然而,这种方式存在一些潜在的安全风险,因为它可能会受到外部攻击者的恶意注入攻击。为了解决这个问题,苹果在 Xcode 11 中引入了 NSSecureUnarchiveFromData 和 NSSecureUnarchiveFromDataTransformer 两个类。

使用 NSSecureUnarchiveFromData

NSSecureUnarchiveFromData 是一个用于解档数据的类,它提供了一种安全的方式来确保数据的完整性和安全性。相比于 NSKeyedUnarchiver,NSSecureUnarchiveFromData 提供了更严格的数据验证和处理机制,能够有效地防止恶意注入攻击。

下面是一个使用 NSSecureUnarchiveFromData 解档数据的示例代码:

Swift

// 获取 Core Data 的上下文

let context = persistentContAIner.viewContext

// 创建一个 NSSecureUnarchiveFromData 实例

let unarchiver = NSSecureUnarchiveFromData()

// 从数据库中获取存储的数据对象

let request: NSFetchRequest<DataObject> = DataObject.fetchRequest()

let dataObjects = try context.fetch(request)

// 解档数据

for dataObject in dataObjects {

if let data = dataObject.data {

do {

let object = try unarchiver.unarchiveTopLevelObjectWithData(data)

// 处理解档后的数据对象

// ...

} catch {

print("FAIled to unarchive data: \(error)")

}

}

}

在这个例子中,我们首先获取 Core Data 的上下文,然后创建一个 NSSecureUnarchiveFromData 实例。接下来,我们使用 NSFetchRequest 来获取存储的数据对象,并通过循环遍历来解档每个数据对象的数据。

使用 NSSecureUnarchiveFromDataTransformer

NSSecureUnarchiveFromDataTransformer 是 NSSecureUnarchiveFromData 的一个子类,它可以将解档过程封装成一个自定义的属性转换器。通过使用 NSSecureUnarchiveFromDataTransformer,我们可以在 Core Data 的数据模型中直接指定使用这个转换器来处理解档过程,从而简化代码并提高可读性。

下面是一个使用 NSSecureUnarchiveFromDataTransformer 的示例代码:

Swift

// 在 Core Data 的数据模型中创建一个属性转换器

class SecureUnarchiveTransformer: NSSecureUnarchiveFromDataTransformer {

override static var allowedTopLevelClasses: [AnyClass] {

return [DataObject.self]

}

}

// 在 AppDelegate 中注册属性转换器

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

// ...

ValueTransformer.setValueTransformer(SecureUnarchiveTransformer(), forName: NSValueTransformerName(rawValue: "SecureUnarchiveTransformer"))

// ...

return true

}

在这个例子中,我们首先创建了一个名为 SecureUnarchiveTransformer 的子类,它继承自 NSSecureUnarchiveFromDataTransformer。我们还重写了 allowedTopLevelClasses 属性,用于指定允许的顶级类。

然后,在 AppDelegate 的 didFinishLaunchingWithOptions 方法中,我们通过调用 ValueTransformer 的 setValueTransformer 方法来注册这个属性转换器。

通过使用 NSSecureUnarchiveFromData 或 NSSecureUnarchiveFromDataTransformer,我们可以在 Core Data 中更安全地解档数据。这个新特性在 Xcode 11 中引入,通过提供更严格的数据验证和处理机制,有效地防止了恶意注入攻击。无论是直接使用 NSSecureUnarchiveFromData,还是通过 NSSecureUnarchiveFromDataTransformer 进行封装,都能够提高数据的安全性和可靠性。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号