Keychain Type 2.0 Quick Errors for SecItemCopyMatching

We had this code snippet with the previous version of Swift

var retrievedData: NSData? var extractedData: Unmanaged<AnyObject>? = nil let status = SecItemCopyMatching(keyChainQuery, &extractedData) if (status == errSecSuccess) { if let validExtractedData = extractedData { let opaque = validExtractedData.toOpaque() retrievedData = Unmanaged<NSData>.fromOpaque(opaque).takeUnretainedValue() } } 

However, now this gives us the following error:

Cannot convert value of type 'inout Unmanaged?' (aka 'inout Optional>') to the expected argument type 'UnsafeMutablePointer' (aka 'UnsafeMutablePointer>')

I lost a little how to fix it. I assume that I need to allocate some memory, make UnsafeMutablePointer for it, and then pass it to SecItemCopyMatching?

I tried this:

  let sizeOfKey = 32 var store = NSMutableData(capacity: sizeOfKey)! let status = SecItemCopyMatching(keyChainQuery, store.bytes) 

But it gave me:

It is impossible to convert a value of type UnsafePointer (aka 'UnsafePointer <()>') to the expected argument type "UnsafeMutablePointer" (aka Error "UnsafeMutablePointer>")

Any idea?

+6
swift swift2 keychain
source share
2 answers

It seems we no longer need Unmanaged<> .

Try:

 var retrievedData: NSData? var extractedData: AnyObject? let status = SecItemCopyMatching(keyChainQuery, &extractedData) if (status == errSecSuccess) { retrievedData = extractedData as? NSData } 
+26
source share

After I was a little puzzled by this decision,

  var retrievedData: NSData? let sizeOfKey = 32 let store = UnsafeMutablePointer<AnyObject?>.alloc(sizeof(AnyObject?) * sizeOfKey) let status = SecItemCopyMatching(keyChainQuery, store) if (status == errSecSuccess) { retrievedData = NSData(bytesNoCopy: store, length: sizeOfKey, freeWhenDone: true) } 

What a compilation. I'm not sure if it really works. If this happens, I will update this message. In the meantime, if people in the know can comment on this, it will be great!

0
source share

All Articles