问题标签 [nssecurecoding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
144 浏览

ios - 尝试在 SpriteKit 编辑器中使用 GKComponent 子类在保存时静默使 Xcode 崩溃

我正在尝试使用 Xcode 中的场景编辑器使用 GameplayKit 和 SpriteKit。我是 SpriteKit 的新手,之前也没有使用过 NSSecureEncoding。老实说,很快就很新。

我有一个基本的 GKComponent 子类,其中一个整数一个字符串属性是这样实现的。

每次我将此组件添加到节点时,Xcode 都会在保存场景时静默崩溃(自动保存或故意)。Xcode 崩溃日志文件中的回溯显示 NSInvalidArgumentException:

在阅读回溯方面也是新的,但在我看来 init?(coder:) 失败并返回一个导致错误的空对象。

此外,如果我删除 String 属性,这将完美无缺。我不知道是什么导致了初始化?失败...

无论如何,我可能会偏离基础,但我很确定我错过了一些简单的东西并且看起来很愚蠢,但我就是想不通。

谢谢你的帮助。

0 投票
2 回答
2784 浏览

ios - 将 NSSecureUnarchiveFromDataTransformer 用于 Transformable 属性时崩溃

在 iOS 12 中,Apple 引入NSSecureUnarchiveFromDataTransformerName了用于 CoreData 模型实体的 Transformable 属性。我曾经将 Transformer Name 字段保留为空,隐式使用NSKeyedUnarchiveFromDataTransformerName. 该转换器现在已被弃用,并且将来保持该字段为空将意味着NSSecureUnarchiveFromDataTransformerName取而代之。

在 iOS 13 中,如果该字段为空,您现在会收到运行时警告,告诉您上述内容。我在任何地方都找不到这方面的任何文档,我得到的唯一参考资料是 WWDC 2018 核心数据最佳实践演讲,其中简要提到了我刚才所说的内容。

现在我有一个带有实体的模型,该实体直接将HTTPURLResponse对象存储在 Transformable 属性中。它符合,我在运行时NSSecureCoding检查了.supportsSecureCodingtrue

变压器名称的设置NSSecureUnarchiveFromDataTransformerName因以下消息而崩溃:

所以听起来 Transformable 属性只能是这些顶级对象。

我尝试按照文档的建议对安全转换器进行子类化并覆盖该allowedTopLevelClasses属性:

然后我想我可以创建一个自定义转换器名称,在模型中设置它并调用该名称,但是如果我在 iOS 11 上,我setValueTransformer(_:forName:)找不到 API 来为我的自定义名称设置默认值。NSKeyedUnarchiveFromDataTransformer

请记住,我使用的是 Xcode 11 Beta 5,但如果我要接受我所说的错误的含义,这似乎无关紧要。

欣赏任何想法。

0 投票
1 回答
369 浏览

swift - Set的安全编码

我的应用程序使用存储自定义类实例的核心数据CustomClass
此类具有许多属性,其中大多数是标准类型,但一个属性是xxx: Set<CustomObject>.
因此xcdatamodeld指定(在其他标准类型xxx中) type的属性TransformablexxxSet<CustomObject>。它的类型是Optional,Transformer 现在是NSSecureUnarchiveFromData
之前没有指定 Transformer,因此解码不安全。但 Apple 现在建议使用安全编码,因为将来不推荐使用不安全编码。

为了启用安全编码,我做了以下事情:
CustomClass现在采用NSSecureCoding而不是NSCoding.
以下内容var已添加到CustomClass

然后我尝试修改public required convenience init?(coder aDecoder: NSCoder) {…},以便xxx安全地解码该属性。我知道,而不是

我必须使用 now decodeObject(of:forKey:)of要解码的对象的类型在哪里,这里是 type Set<CustomObject>
我的问题是我不知道如何制定这个:如果我使用

我得到错误Cannot convert value of type 'Set<CustomObject>.Type' to expected argument type '[AnyClass]?' (aka 'Optional<Array<AnyObject.Type>>‘)
显然编译器没有编译

但反而

即它Set<CustomObject>不被视为单一类型,而是作为类型的集合。

那么,我如何指定只应解码一种类型,即Set<CustomObject>

0 投票
0 回答
62 浏览

core-data - 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 的子类。

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

任何帮助,将不胜感激。

0 投票
1 回答
45 浏览

swift - 如何编码/解码 [CKRecordZone.ID: CKServerChangeToken]?

我正在尝试对 ID 和令牌字典进行编码/解码。但由于某种原因,解码总是给我一个零。

怎么修?

0 投票
1 回答
535 浏览

ios - 将 NSSecureCoding 转换为 Swift 中的 URL

我有一个ShareExtension我得到的URL并且我想使用它但为此我需要cast它作为一个String

上面的代码抛出这个error

无法转换“NSSecureCoding”类型的值?到预期的参数类型'URL'

问题:

我怎样才能NSSecureCoding转换成URL这样我就可以把它转换成String?? 在任何地方都找不到任何东西......对每一次帮助都很高兴!

0 投票
0 回答
64 浏览

ios - “ARCollaborationData”类不允许安全编码

我有一个在 AR 中提供协作的应用程序,我正在关注如何ARSession.CollaborationData使用MultipeerConnectivity.

https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration/3152987-iscollaborationenabled

看来,在 iOS 14 中,这不再可能。当我尝试取消归档时收到以下错误:

“ARCollaborationData”类不允许安全编码。它必须从 supportSecureCoding 返回 YES。

我或多或少地使用了文档中给出的确切代码,它在 iOS 13 上完美运行。现在,对于 iOS 14,我不知道如何解决这个问题。我尝试过发送它并requiringSecureCoding: false尝试创建一个NSKeyedUnarchiverrequiresSecureCoding设置为 false 的。据我所知,我无法更改 for 的实现NSSecureCodingARSession.CollaborationData无论如何都应该存在)。

这是发送数据的代码:

我通过调用这个函数来解码一切:

以前有没有其他人遇到过这个问题?难道这是一个错误,我只需要报告它并等待吗?无论哪种方式,提前感谢任何提示或提示:) 非常感谢他们!

最好的问候, 比约恩

0 投票
1 回答
418 浏览

ios - 在 iOS 中使用安全编码取消归档自定义对象

我正在编码一个NSSecureCoding像这样成功符合的对象数组。

如何取消归档这些数据?我正在尝试这样,但它返回为零。

这是它返回的错误。

无法读取数据,因为它的格式不正确。

0 投票
2 回答
188 浏览

swift - RealityKit 自定义 ARAnchor 未跨设备同步

我在config.isCollaborationEnabled = true环境中使用 Apple 的自定义 ARAnchor。

当我在 DeviceA 上调用以下命令时:

我可以看到代表func session(_ session: ARSession, didAdd anchors: [ARAnchor])被 DeviceA 上的 BoardAnchor 调用。

但是,DeviceB 不会收到这样的委托调用。

但是,如果我在 DeviceA 上添加一个非子类 ARAnchor,我可以看到在 DeviceB 上调用的委托。

所以我真的很困惑为什么子类不起作用......有什么想法吗?

代表

0 投票
0 回答
160 浏览

ios - NSKeyedUnarchiver unarchivedObjectOfClass 实现给出错误

我正在更新一个使用“NSKeyedUnarchiver unarchiveObjectWithData”的旧目标 C 应用程序,该应用程序现已弃用。该应用程序归档一个由自定义对象组成的数组,其中包含(除其他外)另一个不同自定义对象的数组。我在 2 个对象的 .h 文件中实现了 NSSecureCoding,并在两个 .m 文件中添加了“+ (BOOL)supportsSecureCoding”覆盖。

我更新的归档代码可以与旧的不推荐使用的 NSKeyedUnarchiver unarchiveObjectWithData 方法一起正常工作:

但是,使用我更新的未归档代码时出现错误

错误是 ..."value for key 'NS.objects' was of unexpected class 'MyClass... Allowed classes are '{( "NSArray...

如果我更改为unarchivedObjectOfClass:[MyClass class]错误是..."value for key 'root' was of unexpected class 'NSArray...Allowed classes are '{( "MyClass...

取消归档包含自定义类的数组时出了点问题,但我不知道如何修复它,并且可用的文档非常薄弱。我假设存档代码是正确的,因为不推荐使用的 unArchive 方法似乎可以正常使用它。