- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 Core Data 和 CommonCrypto 加密数据。我正在尝试使用 NSValueTransformer 来延迟加密和解密。
但是,当我现在尝试将加密数据保存到持久性存储协调器时,它失败了。每次我尝试将我的数据保存到数据库时,它都会给我:
-[__NSCFString bytes]: unrecognized selector sent to instance
我确定这是某种数据库和 NSManagedObject 不匹配,但我无法弄清楚。我觉得这可能很简单,但我找不到解决方案。我的代码:
NSValueTransformer
class TryHardEncryption: NSValueTransformer {
override class func transformedValueClass() -> AnyClass {
return NSString.self
}
override class func allowsReverseTransformation() -> Bool {
return true
}
override func reverseTransformedValue(value: AnyObject?) -> AnyObject? {
if let message = value as? NSString {
let keyString = "12345678901234567890123456789012"
let keyData: NSData! = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
let keyBytes = UnsafeMutablePointer<Void>(keyData.bytes)
print("keyLength = \(keyData.length), keyData = \(keyData)")
let data: NSData! = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
let dataLength = size_t(data.length)
let dataBytes = UnsafeMutablePointer<Void>(data.bytes)
print("dataLength = \(dataLength), data = \(data)")
let cryptData = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
let cryptPointer = UnsafeMutablePointer<Void>(cryptData!.mutableBytes)
let cryptLength = size_t(cryptData!.length)
let keyLength = size_t(kCCKeySizeAES256)
let operation: CCOperation = UInt32(kCCDecrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionPKCS7Padding + kCCOptionECBMode)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyBytes, keyLength,
nil,
dataBytes, dataLength,
cryptPointer, cryptLength,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
// let x: UInt = numBytesEncrypted
cryptData!.length = Int(numBytesEncrypted)
print("DecryptcryptLength = \(numBytesEncrypted), Decrypt = \(cryptData)")
// Not all data is a UTF-8 string so Base64 is used
let base64cryptString = cryptData!.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
print("base64DecryptString = \(base64cryptString)")
print( "utf8 actual string = \(NSString(data: cryptData!, encoding: NSUTF8StringEncoding))");
return base64cryptString
} else {
print("Error: \(cryptStatus)")
}
}
return nil
}
override func transformedValue(value: AnyObject?) -> AnyObject? {
if let message = value as? NSString {
let keyString = "12345678901234567890123456789012"
let keyData: NSData! = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
let keyBytes = UnsafePointer<UInt8>(keyData.bytes)
print("keyLength = \(keyData.length), keyData = \(keyData)")
let data: NSData! = message.dataUsingEncoding(NSUTF8StringEncoding) as NSData!
let dataLength = Int(data.length)
let dataBytes = UnsafePointer<UInt8>(data.bytes)
print("dataLength = \(dataLength), data = \(data)")
let cryptData = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)!
let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData.mutableBytes)
let cryptLength = size_t(cryptData.length)
let keyLength = size_t(kCCKeySizeAES256)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyBytes, keyLength,
nil,
dataBytes, dataLength,
cryptPointer, cryptLength,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
print("cryptLength = \(numBytesEncrypted), cryptData = \(cryptData)")
// Not all data is a UTF-8 string so Base64 is used
let base64cryptString = cryptData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
print("base64cryptString = \(base64cryptString)")
return NSString(string: base64cryptString) as NSObject
} else {
print("Error: \(cryptStatus)")
}
}
return nil
}
}
要让 NSValueTransformer 工作,我必须做的是:
let transformer: TryHardEncryption = TryHardEncryption()
NSValueTransformer.setValueTransformer(transformer, forName: "TryHardEncryption")
如果没有上面的代码,NSValueTransformer 就不会被调用。
我已将数据库字段标记为可转换类型并将其命名为:TryHardEncryption。你们知道这里出了什么问题吗?
编辑它涉及的属性是:
@NSManaged var establishmentDescription: String?
当我调试它们时,加密和解密函数都返回一个字符串。
最佳答案
我终于弄明白了……我对每个对象必须是什么类型以及我的 nsvaluetransformer 必须返回什么感到困惑。我没有在 nsvaluetransformer 中将值转换为正确的类型,因此我在代码中返回了 nil。然而,它并没有以我很容易弄清楚的方式崩溃。其次,我将实体列改回 NSObject。在 transformedValue 方法中返回一个 NSData 对象,在 reverseTransformedValue 方法中返回一个 NSString。这实际上是我需要让它工作的全部。非常感谢你的帮助。这确实是一个类型错误。
关于iOS 核心数据加密使用 NSValueTransformer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172285/
当尝试在 Core Data 中使用系统提供的 NSValueTransformer 时,我收到以下警告: Warning: no NSValueTransformer with class name
我正在使用 NSValueTransformer类来转换 NSDictionary对象到自定义对象。 我已经使用以下方法实现了子类: + (Class)transformedValueClass +
样本iPhoneCoreDataRecipes , UIImage可以通过核心数据技术保存到数据库。 NSValueTransformer 用于从 UIImage 到 NSData 的转换,反之亦然。
我正在尝试使用 Core Data 和 CommonCrypto 加密数据。我正在尝试使用 NSValueTransformer 来延迟加密和解密。 但是,当我现在尝试将加密数据保存到持久性存储协调器
我的共享用户默认 plist 看起来像这样: menuItems (Array) Item 0 (Dictionary) name (String) "Menu Item 0" s
我无法在我的 ManagedObjectContext 上调用 save:(NSErrro **) 时调用我的 NSValueTransformer 实现。 我已经尝试通过自己的 ManagedObj
我正在尝试使用 Core Data NSValueTransformer 将 NSArray 转换为 NSString。不知道能不能存档,但是看到apple的官方文档有一段代码: @interface
我有一个具有相当简单数据模型的 Core Data 应用程序。我希望能够将 NSImage 的实例作为 PNG Bitmap NSData 对象存储在持久存储中,以节省空间。 为此,我编写了一个简单的
我想进行一些绑定(bind),根据文本字段中的单个数值来切换弹出菜单中的项目标题。让我解释一下: 这是我的用户界面: 我希望我的菜单项根据文本字段中的数字自动调整为单数或复数。例如,当我在框中输入“1
我有一个表列,我将其绑定(bind)到 NSArrayController 中的值。我想做的是仅显示数组 Controller 中实际值的子字符串。到目前为止,我一直试图做到这一点的方法是创建一个 N
具体来说,假设我有一个 NSManagedObject,其“statusCode”属性设置为可转换,并且有一个可逆值转换器子类,可以从 NSStrings 转换为 NSNumbers,反之亦然。这个想
我试图根据核心数据中的枚举值来显示 NSImage。我在绑定(bind)到我所使用的值的 NSImageCell 上使用值转换器选择要显示的图像。 它工作完美并且符合预期,不幸的是,当使用 NSVal
这是我对 NSValueTransformer 的实现 + (Class)transformedValueClass { return [NSData class]; } + (BOOL)al
我想制作一个带有预定值列表的NSComboBox。底层对象是自定义 Swift 结构,我使用自定义 NSValueTransformer 将这些对象与我存储的底层字符串表示形式进行相互转换。 我想限制
我正在使用 NSValueTranformer 来加密某些核心数据属性。这一切都很好,除了我需要能够根据 NSManagedObject 使用不同的加密 key 。无论如何我可以从我的转换器类中访问这
如果您扩展 NSManagedObject 或使用静态方法实例化您的 Model 类或将 NSPersistentStoreCoordinator 类型设置为 NSInMemoryStoreType
我正在尝试将从 iPhone 相机拍摄的照片保存到核心数据。 我有从相机拍摄的 UIImage。之后,我不知道我应该做什么。 每张图片都与一个问题实体相关联。现在问题实体没有图像字段。它与图像实体有关
我试图将实体放入核心数据存储中,每个实体都具有非标准数据类型——一个是 NSDocument,另一个是 NSURL。我在 .xcdatamodeld 中得到它,我需要将它们声明为 Transforma
在我的 Core Data 模式中,我在实体中有一个“可转换”属性,它使用 NSValueTransformer,其目的是通过一些压缩将 UIImage 转换为 NSData。从这个属性,我最近开始收
我正在使用自定义 NSValueTransformer 将颜色信息存储在我的核心数据存储中。一旦颜色数据已经存储在存储中(即一旦应用程序已经运行并退出一次),Transformable 数据和 UIC
我是一名优秀的程序员,十分优秀!