首页 > 解决方案 > Core Data 是否绕过安全性?

问题描述

我的 iOS 13.2 Swift 应用程序是一种 SceneKit 编辑器,它使用 Core Data 来持久化用户编辑。我想知道 Core Data 是否可能与下面的消息相关联,因为 NSManagedObject 是 NSObject 的子类,并且由于我在没有 Core Data 的情况下创建的测试应用程序不会导致显示消息。

虽然我没有对任何支持 NSSecureCoding 的 SceneKit 类进行子类化,并且应用程序中没有其他类使用 NSSecureCoding,但当 SCNScene 显示在 SCNView 中时,会显示以下消息:

显示的消息:

[general] NSSecureCoding 允许的类列表包含 [NSObject 类],它通过允许隐式解码任何 Objective-C 类来绕过安全性。考虑通过仅列出您希望解码的类或比 NSObject 更具体的基类来减少解码期间允许的类的范围。

即使可以多次重新打开 SCNScene 以反映用户的编辑,此消息也只会显示一次。

可能的原因 1. 一些核心数据实体包含用于显示缩略图的二进制数据属性。但是,当我注释掉与创建/显示缩略图相关的代码时,仍会显示上述消息。缩略图数据是使用以下代码创建的,该代码返回一个可选数据对象。我想知道这一点,因为 Swift 桥接到 NSData,它是 NSObject 的子类。

static func createNonCachedItemThumbnailData(item: Item) -> Data? {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let dataSource = appDelegate.dataSource
        guard let selectedDesign = dataSource.selectedDesign else { return nil }
        let resourceSubdirectoryName = selectedDesign.uniqueID!
        guard let bundleURL = Bundle.main.url(forResource: item.uniqueID!, withExtension: "png", subdirectory: resourceSubdirectoryName + ".scnassets") else { return nil }
        guard let imageSource = CGImageSourceCreateWithURL(bundleURL as CFURL, nil) else { return nil }
        /*
        maxDimension is the lesser of the width or height of the UIImageView in ItemSCNNodeSelectionViewCell.
        */
        let maxDimension: CGFloat = 64.0
        let options: [NSString: Any] = [
            kCGImageSourceThumbnailMaxPixelSize: maxDimension,
            kCGImageSourceCreateThumbnailFromImageAlways: true]
        guard let scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary) else { return nil }

        return UIImage(cgImage: scaledImage).pngData()
    }
  1. 核心数据实体之一使用 NSKeyedArchiver/NSKeyedUnarchiver 将 SCNMaterial 归档为二进制数据。我没有为此属性使用可转换类型,因为我读到可转换类型在保存上下文时不会注意到更改。这段代码似乎与问题相去甚远,但编译器可能已经注意到了。

任何帮助,将不胜感激。

标签: core-datanssecurecoding

解决方案


推荐阅读