问题标签 [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.
ios - 尝试在 SpriteKit 编辑器中使用 GKComponent 子类在保存时静默使 Xcode 崩溃
我正在尝试使用 Xcode 中的场景编辑器使用 GameplayKit 和 SpriteKit。我是 SpriteKit 的新手,之前也没有使用过 NSSecureEncoding。老实说,很快就很新。
我有一个基本的 GKComponent 子类,其中一个整数一个字符串属性是这样实现的。
每次我将此组件添加到节点时,Xcode 都会在保存场景时静默崩溃(自动保存或故意)。Xcode 崩溃日志文件中的回溯显示 NSInvalidArgumentException:
在阅读回溯方面也是新的,但在我看来 init?(coder:) 失败并返回一个导致错误的空对象。
此外,如果我删除 String 属性,这将完美无缺。我不知道是什么导致了初始化?失败...
无论如何,我可能会偏离基础,但我很确定我错过了一些简单的东西并且看起来很愚蠢,但我就是想不通。
谢谢你的帮助。
ios - 将 NSSecureUnarchiveFromDataTransformer 用于 Transformable 属性时崩溃
在 iOS 12 中,Apple 引入NSSecureUnarchiveFromDataTransformerName
了用于 CoreData 模型实体的 Transformable 属性。我曾经将 Transformer Name 字段保留为空,隐式使用NSKeyedUnarchiveFromDataTransformerName
. 该转换器现在已被弃用,并且将来保持该字段为空将意味着NSSecureUnarchiveFromDataTransformerName
取而代之。
在 iOS 13 中,如果该字段为空,您现在会收到运行时警告,告诉您上述内容。我在任何地方都找不到这方面的任何文档,我得到的唯一参考资料是 WWDC 2018 核心数据最佳实践演讲,其中简要提到了我刚才所说的内容。
现在我有一个带有实体的模型,该实体直接将HTTPURLResponse
对象存储在 Transformable 属性中。它符合,我在运行时NSSecureCoding
检查了.supportsSecureCoding
true
变压器名称的设置NSSecureUnarchiveFromDataTransformerName
因以下消息而崩溃:
所以听起来 Transformable 属性只能是这些顶级对象。
我尝试按照文档的建议对安全转换器进行子类化并覆盖该allowedTopLevelClasses
属性:
然后我想我可以创建一个自定义转换器名称,在模型中设置它并调用该名称,但是如果我在 iOS 11 上,我setValueTransformer(_:forName:)
找不到 API 来为我的自定义名称设置默认值。NSKeyedUnarchiveFromDataTransformer
请记住,我使用的是 Xcode 11 Beta 5,但如果我要接受我所说的错误的含义,这似乎无关紧要。
欣赏任何想法。
swift - Set的安全编码
我的应用程序使用存储自定义类实例的核心数据CustomClass
。
此类具有许多属性,其中大多数是标准类型,但一个属性是xxx: Set<CustomObject>
.
因此xcdatamodeld
指定(在其他标准类型xxx
中) type的属性Transformable
。xxx
是Set<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>
?
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 的子类。
- 核心数据实体之一使用 NSKeyedArchiver/NSKeyedUnarchiver 将 SCNMaterial 归档为二进制数据。我没有为此属性使用可转换类型,因为我读到可转换类型在保存上下文时不会注意到更改。这段代码似乎与问题相去甚远,但编译器可能已经注意到了。
任何帮助,将不胜感激。
swift - 如何编码/解码 [CKRecordZone.ID: CKServerChangeToken]?
我正在尝试对 ID 和令牌字典进行编码/解码。但由于某种原因,解码总是给我一个零。
怎么修?
ios - 将 NSSecureCoding 转换为 Swift 中的 URL
我有一个ShareExtension
我得到的URL
并且我想使用它但为此我需要cast
它作为一个String
:
上面的代码抛出这个error
:
无法转换“NSSecureCoding”类型的值?到预期的参数类型'URL'
问题:
我怎样才能NSSecureCoding
转换成URL
这样我就可以把它转换成String
?? 在任何地方都找不到任何东西......对每一次帮助都很高兴!
ios - “ARCollaborationData”类不允许安全编码
我有一个在 AR 中提供协作的应用程序,我正在关注如何ARSession.CollaborationData
使用MultipeerConnectivity
.
看来,在 iOS 14 中,这不再可能。当我尝试取消归档时收到以下错误:
“ARCollaborationData”类不允许安全编码。它必须从 supportSecureCoding 返回 YES。
我或多或少地使用了文档中给出的确切代码,它在 iOS 13 上完美运行。现在,对于 iOS 14,我不知道如何解决这个问题。我尝试过发送它并requiringSecureCoding: false
尝试创建一个NSKeyedUnarchiver
也requiresSecureCoding
设置为 false 的。据我所知,我无法更改 for 的实现NSSecureCoding
(ARSession.CollaborationData
无论如何都应该存在)。
这是发送数据的代码:
我通过调用这个函数来解码一切:
以前有没有其他人遇到过这个问题?难道这是一个错误,我只需要报告它并等待吗?无论哪种方式,提前感谢任何提示或提示:) 非常感谢他们!
最好的问候, 比约恩
ios - 在 iOS 中使用安全编码取消归档自定义对象
我正在编码一个NSSecureCoding
像这样成功符合的对象数组。
如何取消归档这些数据?我正在尝试这样,但它返回为零。
这是它返回的错误。
无法读取数据,因为它的格式不正确。
swift - RealityKit 自定义 ARAnchor 未跨设备同步
我在config.isCollaborationEnabled = true
环境中使用 Apple 的自定义 ARAnchor。
当我在 DeviceA 上调用以下命令时:
我可以看到代表func session(_ session: ARSession, didAdd anchors: [ARAnchor])
被 DeviceA 上的 BoardAnchor 调用。
但是,DeviceB 不会收到这样的委托调用。
但是,如果我在 DeviceA 上添加一个非子类 ARAnchor,我可以看到在 DeviceB 上调用的委托。
所以我真的很困惑为什么子类不起作用......有什么想法吗?
代表
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 方法似乎可以正常使用它。